diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 575658ff8eac5..772e2cf87750c 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -3148,11 +3148,16 @@ static mlir::omp::DistributeOp genCompositeDistributeSimd( genSimdClauses(converter, semaCtx, simdItem->clauses, loc, simdClauseOps, simdReductionSyms); - // TODO: Support delayed privatization. - DataSharingProcessor dsp(converter, semaCtx, simdItem->clauses, eval, - /*shouldCollectPreDeterminedSymbols=*/true, - /*useDelayedPrivatization=*/false, symTable); - dsp.processStep1(); + DataSharingProcessor distributeItemDSP( + converter, semaCtx, distributeItem->clauses, eval, + /*shouldCollectPreDeterminedSymbols=*/false, + /*useDelayedPrivatization=*/true, symTable); + distributeItemDSP.processStep1(&distributeClauseOps); + + DataSharingProcessor simdItemDSP(converter, semaCtx, simdItem->clauses, eval, + /*shouldCollectPreDeterminedSymbols=*/true, + /*useDelayedPrivatization=*/true, symTable); + simdItemDSP.processStep1(&simdClauseOps); // Pass the innermost leaf construct's clauses because that's where COLLAPSE // is placed by construct decomposition. @@ -3163,13 +3168,15 @@ static mlir::omp::DistributeOp genCompositeDistributeSimd( // Operation creation. EntryBlockArgs distributeArgs; - // TODO: Add private syms and vars. + distributeArgs.priv.syms = distributeItemDSP.getDelayedPrivSymbols(); + distributeArgs.priv.vars = distributeClauseOps.privateVars; auto distributeOp = genWrapperOp( converter, loc, distributeClauseOps, distributeArgs); distributeOp.setComposite(/*val=*/true); EntryBlockArgs simdArgs; - // TODO: Add private syms and vars. + simdArgs.priv.syms = simdItemDSP.getDelayedPrivSymbols(); + simdArgs.priv.vars = simdClauseOps.privateVars; simdArgs.reduction.syms = simdReductionSyms; simdArgs.reduction.vars = simdClauseOps.reductionVars; auto simdOp = @@ -3179,7 +3186,7 @@ static mlir::omp::DistributeOp genCompositeDistributeSimd( genLoopNestOp(converter, symTable, semaCtx, eval, loc, queue, simdItem, loopNestClauseOps, iv, {{distributeOp, distributeArgs}, {simdOp, simdArgs}}, - llvm::omp::Directive::OMPD_distribute_simd, dsp); + llvm::omp::Directive::OMPD_distribute_simd, simdItemDSP); return distributeOp; } diff --git a/flang/test/Lower/OpenMP/distribute-simd.f90 b/flang/test/Lower/OpenMP/distribute-simd.f90 index a43600143dc49..d0316d1a136ab 100644 --- a/flang/test/Lower/OpenMP/distribute-simd.f90 +++ b/flang/test/Lower/OpenMP/distribute-simd.f90 @@ -7,7 +7,7 @@ subroutine distribute_simd_aligned(A) use iso_c_binding type(c_ptr) :: A - + !$omp teams ! CHECK: omp.distribute @@ -57,3 +57,22 @@ subroutine distribute_simd_simdlen() !$omp end teams end subroutine distribute_simd_simdlen + +! CHECK-LABEL: func.func @_QPdistribute_simd_private( +subroutine distribute_simd_private() + integer, allocatable :: tmp + ! CHECK: omp.teams + !$omp teams + ! CHECK: omp.distribute + ! CHECK: omp.simd + ! CHECK-SAME: private(@[[PRIV_BOX_SYM:.*]] %{{.*}} -> %[[PRIV_BOX:.*]], @[[PRIV_IVAR_SYM:.*]] %{{.*}} -> %[[PRIV_IVAR:.*]] : !fir.ref>>, !fir.ref) + ! CHECK-NEXT: omp.loop_nest (%[[IVAR:.*]]) : i32 + !$omp distribute simd private(tmp) + do index_ = 1, 10 + ! CHECK: %[[PRIV_BOX_DECL:.*]]:2 = hlfir.declare %[[PRIV_BOX]] + ! CHECK: %[[PRIV_IVAR_DECL:.*]]:2 = hlfir.declare %[[PRIV_IVAR]] + ! CHECK: hlfir.assign %[[IVAR]] to %[[PRIV_IVAR_DECL]]#0 + end do + !$omp end distribute simd + !$omp end teams +end subroutine distribute_simd_private