@@ -1651,10 +1651,11 @@ allocatePrivateVars(llvm::IRBuilderBase &builder,
16511651}
16521652
16531653static LogicalResult copyFirstPrivateVars (
1654- llvm::IRBuilderBase &builder, LLVM::ModuleTranslation &moduleTranslation,
1654+ mlir::Operation *op, llvm::IRBuilderBase &builder,
1655+ LLVM::ModuleTranslation &moduleTranslation,
16551656 SmallVectorImpl<mlir::Value> &mlirPrivateVars,
16561657 ArrayRef<llvm::Value *> llvmPrivateVars,
1657- SmallVectorImpl<omp::PrivateClauseOp> &privateDecls,
1658+ SmallVectorImpl<omp::PrivateClauseOp> &privateDecls, bool insertBarrier,
16581659 llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
16591660 // Apply copy region for firstprivate.
16601661 bool needsFirstprivate =
@@ -1702,6 +1703,14 @@ static LogicalResult copyFirstPrivateVars(
17021703 moduleTranslation.forgetMapping (copyRegion);
17031704 }
17041705
1706+ if (insertBarrier) {
1707+ llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder ();
1708+ llvm::OpenMPIRBuilder::InsertPointOrErrorTy res =
1709+ ompBuilder->createBarrier (builder.saveIP (), llvm::omp::OMPD_barrier);
1710+ if (failed (handleError (res, *op)))
1711+ return failure ();
1712+ }
1713+
17051714 return success ();
17061715}
17071716
@@ -2310,8 +2319,9 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
23102319 // firstprivate copy region
23112320 setInsertPointForPossiblyEmptyBlock (builder, copyBlock);
23122321 if (failed (copyFirstPrivateVars (
2313- builder, moduleTranslation, privateVarsInfo.mlirVars ,
2314- taskStructMgr.getLLVMPrivateVarGEPs (), privateVarsInfo.privatizers )))
2322+ taskOp, builder, moduleTranslation, privateVarsInfo.mlirVars ,
2323+ taskStructMgr.getLLVMPrivateVarGEPs (), privateVarsInfo.privatizers ,
2324+ taskOp.getPrivateNeedsBarrier ())))
23152325 return llvm::failure ();
23162326
23172327 // Set up for call to createTask()
@@ -2531,8 +2541,9 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
25312541 return failure ();
25322542
25332543 if (failed (copyFirstPrivateVars (
2534- builder, moduleTranslation, privateVarsInfo.mlirVars ,
2535- privateVarsInfo.llvmVars , privateVarsInfo.privatizers )))
2544+ wsloopOp, builder, moduleTranslation, privateVarsInfo.mlirVars ,
2545+ privateVarsInfo.llvmVars , privateVarsInfo.privatizers ,
2546+ wsloopOp.getPrivateNeedsBarrier ())))
25362547 return failure ();
25372548
25382549 assert (afterAllocas.get ()->getSinglePredecessor ());
@@ -2692,8 +2703,9 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
26922703 return llvm::make_error<PreviouslyReportedError>();
26932704
26942705 if (failed (copyFirstPrivateVars (
2695- builder, moduleTranslation, privateVarsInfo.mlirVars ,
2696- privateVarsInfo.llvmVars , privateVarsInfo.privatizers )))
2706+ opInst, builder, moduleTranslation, privateVarsInfo.mlirVars ,
2707+ privateVarsInfo.llvmVars , privateVarsInfo.privatizers ,
2708+ opInst.getPrivateNeedsBarrier ())))
26972709 return llvm::make_error<PreviouslyReportedError>();
26982710
26992711 if (failed (
@@ -4657,8 +4669,9 @@ convertOmpDistribute(Operation &opInst, llvm::IRBuilderBase &builder,
46574669 return llvm::make_error<PreviouslyReportedError>();
46584670
46594671 if (failed (copyFirstPrivateVars (
4660- builder, moduleTranslation, privVarsInfo.mlirVars ,
4661- privVarsInfo.llvmVars , privVarsInfo.privatizers )))
4672+ distributeOp, builder, moduleTranslation, privVarsInfo.mlirVars ,
4673+ privVarsInfo.llvmVars , privVarsInfo.privatizers ,
4674+ distributeOp.getPrivateNeedsBarrier ())))
46624675 return llvm::make_error<PreviouslyReportedError>();
46634676
46644677 llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder ();
@@ -5422,9 +5435,9 @@ convertOmpTarget(Operation &opInst, llvm::IRBuilderBase &builder,
54225435 return llvm::make_error<PreviouslyReportedError>();
54235436
54245437 if (failed (copyFirstPrivateVars (
5425- builder, moduleTranslation, privateVarsInfo.mlirVars ,
5438+ targetOp, builder, moduleTranslation, privateVarsInfo.mlirVars ,
54265439 privateVarsInfo.llvmVars , privateVarsInfo.privatizers ,
5427- &mappedPrivateVars)))
5440+ targetOp. getPrivateNeedsBarrier (), &mappedPrivateVars)))
54285441 return llvm::make_error<PreviouslyReportedError>();
54295442
54305443 SmallVector<Region *> privateCleanupRegions;
0 commit comments