diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index 1d5fd7460a643..63f848902ba31 100644 --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -462,7 +462,7 @@ mlir::acc::FirstprivateRecipeOp Fortran::lower::createOrGetFirstprivateRecipe( return recipe; } -template +template static void genPrivatizations(const Fortran::parser::AccObjectList &objectList, Fortran::lower::AbstractConverter &converter, @@ -478,21 +478,29 @@ genPrivatizations(const Fortran::parser::AccObjectList &objectList, mlir::Value baseAddr = gatherDataOperandAddrAndBounds( converter, builder, semanticsContext, stmtCtx, accObject, operandLocation, asFortran, bounds); - Op recipe; - if constexpr (std::is_same_v) { + + RecipeOp recipe; + if constexpr (std::is_same_v) { std::string recipeName = fir::getTypeAsString( baseAddr.getType(), converter.getKindMap(), "privatization"); recipe = Fortran::lower::createOrGetPrivateRecipe( builder, recipeName, operandLocation, baseAddr.getType()); + auto op = createDataEntryOp( + builder, operandLocation, baseAddr, asFortran, bounds, true, + mlir::acc::DataClause::acc_private); + dataOperands.push_back(op.getAccPtr()); } else { std::string recipeName = fir::getTypeAsString( baseAddr.getType(), converter.getKindMap(), "firstprivatization"); recipe = Fortran::lower::createOrGetFirstprivateRecipe( builder, recipeName, operandLocation, baseAddr.getType()); + auto op = createDataEntryOp( + builder, operandLocation, baseAddr, asFortran, bounds, true, + mlir::acc::DataClause::acc_firstprivate); + dataOperands.push_back(op.getAccPtr()); } privatizations.push_back(mlir::SymbolRefAttr::get( builder.getContext(), recipe.getSymName().str())); - dataOperands.push_back(baseAddr); } } diff --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90 index 8bf3fd5781230..2e89327de30d4 100644 --- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90 @@ -464,8 +464,11 @@ subroutine acc_parallel_loop a(i) = b(i) END DO -! CHECK: acc.parallel firstprivate(@firstprivatization_ref_10xf32 -> %[[B]] : !fir.ref>) private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref>) { -! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref>) { +! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} +! CHECK: %[[ACC_PRIVATE_B:.*]] = acc.firstprivate varPtr(%[[B]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} +! CHECK: acc.parallel firstprivate(@firstprivatization_ref_10xf32 -> %[[ACC_PRIVATE_B]] : !fir.ref>) private(@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) { +! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} +! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) { ! CHECK: fir.do_loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} diff --git a/flang/test/Lower/OpenACC/acc-parallel.f90 b/flang/test/Lower/OpenACC/acc-parallel.f90 index b8c4cb94c53f4..54b928cdeec1f 100644 --- a/flang/test/Lower/OpenACC/acc-parallel.f90 +++ b/flang/test/Lower/OpenACC/acc-parallel.f90 @@ -308,7 +308,10 @@ subroutine acc_parallel !$acc parallel private(a) firstprivate(b) private(c) !$acc end parallel -! CHECK: acc.parallel firstprivate(@firstprivatization_ref_10x10xf32 -> %[[B]] : !fir.ref>) private(@privatization_ref_10x10xf32 -> %[[A]] : !fir.ref>, @privatization_ref_10x10xf32 -> %[[C]] : !fir.ref>) { +! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "a"} +! CHECK: %[[ACC_FPRIVATE_B:.*]] = acc.firstprivate varPtr(%[[B]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "b"} +! CHECK: %[[ACC_PRIVATE_C:.*]] = acc.private varPtr(%[[C]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "c"} +! CHECK: acc.parallel firstprivate(@firstprivatization_ref_10x10xf32 -> %[[ACC_FPRIVATE_B]] : !fir.ref>) private(@privatization_ref_10x10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>, @privatization_ref_10x10xf32 -> %[[ACC_PRIVATE_C]] : !fir.ref>) { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} diff --git a/flang/test/Lower/OpenACC/acc-serial-loop.f90 b/flang/test/Lower/OpenACC/acc-serial-loop.f90 index 7108464c1f7ff..eb57ef28e4f06 100644 --- a/flang/test/Lower/OpenACC/acc-serial-loop.f90 +++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90 @@ -380,8 +380,11 @@ subroutine acc_serial_loop a(i) = b(i) END DO -! CHECK: acc.serial firstprivate(@firstprivatization_ref_10xf32 -> %[[B]] : !fir.ref>) private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref>) { -! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[A]] : !fir.ref>) { +! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} +! CHECK: %[[ACC_FPRIVATE_B:.*]] = acc.firstprivate varPtr(%[[B]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "b"} +! CHECK: acc.serial firstprivate(@firstprivatization_ref_10xf32 -> %[[ACC_FPRIVATE_B]] : !fir.ref>) private(@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) { +! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "a"} +! CHECK: acc.loop private(@privatization_ref_10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>) { ! CHECK: fir.do_loop ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} diff --git a/flang/test/Lower/OpenACC/acc-serial.f90 b/flang/test/Lower/OpenACC/acc-serial.f90 index fcc7d0e504318..2e760f44c54ec 100644 --- a/flang/test/Lower/OpenACC/acc-serial.f90 +++ b/flang/test/Lower/OpenACC/acc-serial.f90 @@ -251,7 +251,10 @@ subroutine acc_serial !$acc serial private(a) firstprivate(b) private(c) !$acc end serial -! CHECK: acc.serial firstprivate(@firstprivatization_ref_10x10xf32 -> %[[B]] : !fir.ref>) private(@privatization_ref_10x10xf32 -> %[[A]] : !fir.ref>, @privatization_ref_10x10xf32 -> %[[C]] : !fir.ref>) { +! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "a"} +! CHECK: %[[ACC_FPRIVATE_B:.*]] = acc.firstprivate varPtr(%[[B]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "b"} +! CHECK: %[[ACC_PRIVATE_C:.*]] = acc.private varPtr(%[[C]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {name = "c"} +! CHECK: acc.serial firstprivate(@firstprivatization_ref_10x10xf32 -> %[[ACC_FPRIVATE_B]] : !fir.ref>) private(@privatization_ref_10x10xf32 -> %[[ACC_PRIVATE_A]] : !fir.ref>, @privatization_ref_10x10xf32 -> %[[ACC_PRIVATE_C]] : !fir.ref>) { ! CHECK: acc.yield ! CHECK-NEXT: }{{$}}