Index: flang/lib/Lower/OpenMP.cpp =================================================================== --- flang/lib/Lower/OpenMP.cpp +++ flang/lib/Lower/OpenMP.cpp @@ -78,6 +78,7 @@ } } +template static void privatizeVars(Fortran::lower::AbstractConverter &converter, const Fortran::parser::OmpClauseList &opClauseList) { fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); @@ -95,8 +96,11 @@ hasFirstPrivateOp = true; } } - if (hasFirstPrivateOp) - firOpBuilder.create(converter.getCurrentLocation()); + // TODO: Do not emit BarrierOp for single construct, either. + // FIXME: Is BarrierOp needed for offloading constructs? + if constexpr (!std::is_same_v) + if (hasFirstPrivateOp) + firOpBuilder.create(converter.getCurrentLocation()); firOpBuilder.restoreInsertionPoint(insPt); } @@ -376,7 +380,7 @@ // Handle privatization. Do not privatize if this is the outer operation. if (clauses && !outerCombined) - privatizeVars(converter, *clauses); + privatizeVars(converter, *clauses); if (std::is_same_v) { threadPrivatizeVars(converter, eval); Index: flang/test/Lower/OpenMP/task.f90 =================================================================== --- flang/test/Lower/OpenMP/task.f90 +++ flang/test/Lower/OpenMP/task.f90 @@ -152,6 +152,7 @@ !CHECK: %[[mytype_var_firstprivate:.+]] = fir.alloca !fir.type<_QFtask_firstprivateTmytype{x:i32}> !CHECK: %[[mytype_var_load:.+]] = fir.load %[[mytype_var]] : !fir.ref> !CHECK: fir.store %[[mytype_var_load]] to %[[mytype_var_firstprivate]] + !CHECK-NOT: omp.barrier !CHECK: fir.call @_QPbaz(%[[int_var_firstprivate]], %[[mytype_var_firstprivate]]) : (!fir.ref, !fir.ref>) -> () call baz(int_var, mytype_var) !CHECK: omp.terminator