diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index 6ae270f63f5cf..446b1529ca008 100644 --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -1658,10 +1658,18 @@ static void privatizeIv(Fortran::lower::AbstractConverter &converter, mlir::acc::DataClause::acc_private, ivValue.getType()); privateOperands.push_back(op.getAccPtr()); - ivPrivate.push_back(op.getAccPtr()); privatizations.push_back(mlir::SymbolRefAttr::get(builder.getContext(), recipe.getSymName().str())); + + // Map the new private iv to its symbol for the scope of the loop. bindSymbol + // might create a hlfir.declare op, if so, we map its result in order to + // use the sym value in the scope. converter.bindSymbol(sym, op.getAccPtr()); + auto privateValue = converter.getSymbolAddress(sym); + if (auto declareOp = + mlir::dyn_cast(privateValue.getDefiningOp())) + privateValue = declareOp.getResults()[0]; + ivPrivate.push_back(privateValue); } static mlir::acc::LoopOp diff --git a/flang/test/Lower/OpenACC/acc-private.f90 b/flang/test/Lower/OpenACC/acc-private.f90 index 29074cbaedc91..ba582d40f0f51 100644 --- a/flang/test/Lower/OpenACC/acc-private.f90 +++ b/flang/test/Lower/OpenACC/acc-private.f90 @@ -382,3 +382,22 @@ subroutine sub1() end module ! CHECK: acc.parallel private(@privatization_ref_10xf32 -> %{{.*}} : !fir.ref>) + +subroutine acc_private_use() + integer :: i, j + + !$acc parallel loop + do i = 1, 10 + j = i + end do +end + +! CHECK-LABEL: func.func @_QPacc_private_use() +! CHECK: %[[I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFacc_private_useEi"} +! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %0 {uniq_name = "_QFacc_private_useEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) +! CHECK: acc.parallel +! CHECK: %[[PRIV_I:.*]] = acc.private varPtr(%[[DECL_I]]#1 : !fir.ref) -> !fir.ref {implicit = true, name = ""} +! CHECK: %[[DECL_PRIV_I:.*]]:2 = hlfir.declare %[[PRIV_I]] {uniq_name = "_QFacc_private_useEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) +! CHECK: acc.loop private(@privatization_ref_i32 -> %[[PRIV_I]] : !fir.ref) control(%[[IV0:.*]] : i32) = (%c1{{.*}} : i32) to (%c10{{.*}} : i32) step (%c1{{.*}} : i32) +! CHECK: fir.store %[[IV0]] to %[[DECL_PRIV_I]]#0 : !fir.ref +! CHECK: %{{.*}} = fir.load %[[DECL_PRIV_I]]#0 : !fir.ref