diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index b636416ea8c1e..43bdbdb4644e4 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -1400,21 +1400,23 @@ class FirConverter : public Fortran::lower::AbstractConverter { mlir::Value genLoopVariableAddress(mlir::Location loc, const Fortran::semantics::Symbol &sym, bool isUnordered) { - if (isUnordered || sym.has() || - sym.has()) { - if (!shallowLookupSymbol(sym) && - !GetSymbolDSA(sym).test( - Fortran::semantics::Symbol::Flag::OmpShared)) { - // Do concurrent loop variables are not mapped yet since they are local - // to the Do concurrent scope (same for OpenMP loops). - mlir::OpBuilder::InsertPoint insPt = builder->saveInsertionPoint(); - builder->setInsertionPointToStart(builder->getAllocaBlock()); - mlir::Type tempTy = genType(sym); - mlir::Value temp = - builder->createTemporaryAlloc(loc, tempTy, toStringRef(sym.name())); - bindIfNewSymbol(sym, temp); - builder->restoreInsertionPoint(insPt); - } + if (!shallowLookupSymbol(sym) && + (isUnordered || + GetSymbolDSA(sym).test(Fortran::semantics::Symbol::Flag::OmpPrivate) || + GetSymbolDSA(sym).test( + Fortran::semantics::Symbol::Flag::OmpFirstPrivate) || + GetSymbolDSA(sym).test( + Fortran::semantics::Symbol::Flag::OmpLastPrivate) || + GetSymbolDSA(sym).test(Fortran::semantics::Symbol::Flag::OmpLinear))) { + // Do concurrent loop variables are not mapped yet since they are + // local to the Do concurrent scope (same for OpenMP loops). + mlir::OpBuilder::InsertPoint insPt = builder->saveInsertionPoint(); + builder->setInsertionPointToStart(builder->getAllocaBlock()); + mlir::Type tempTy = genType(sym); + mlir::Value temp = + builder->createTemporaryAlloc(loc, tempTy, toStringRef(sym.name())); + bindIfNewSymbol(sym, temp); + builder->restoreInsertionPoint(insPt); } auto entry = lookupSymbol(sym); (void)entry; diff --git a/flang/test/Lower/do_concurrent_loop_in_nested_block.f90 b/flang/test/Lower/do_concurrent_loop_in_nested_block.f90 new file mode 100644 index 0000000000000..8c4f5048e87fa --- /dev/null +++ b/flang/test/Lower/do_concurrent_loop_in_nested_block.f90 @@ -0,0 +1,26 @@ +! RUN: %flang_fc1 -emit-hlfir -mmlir --enable-delayed-privatization-staging=true -o - %s | FileCheck %s + +subroutine loop_in_nested_block + implicit none + integer :: i, j + + do concurrent (i=1:10) local(j) + block + do j=1,20 + end do + end block + end do +end subroutine + +! CHECK-LABEL: func.func @_QPloop_in_nested_block() { +! CHECK: %[[OUTER_J_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "{{.*}}Ej"} +! CHECK: fir.do_concurrent { +! CHECK: fir.do_concurrent.loop {{.*}} local(@{{.*}} %[[OUTER_J_DECL]]#0 -> %[[LOCAL_J_ARG:.*]] : !fir.ref) { +! CHECK: %[[LOCAL_J_DECL:.*]]:2 = hlfir.declare %[[LOCAL_J_ARG]] +! CHECK: fir.do_loop {{.*}} iter_args(%[[NESTED_LOOP_ARG:.*]] = {{.*}}) { +! CHECK: fir.store %[[NESTED_LOOP_ARG]] to %[[LOCAL_J_DECL]]#0 +! CHECK: } +! CHECK: } +! CHECK: } +! CHECK: } +