@@ -1512,10 +1512,11 @@ allocatePrivateVars(llvm::IRBuilderBase &builder,
15121512}
15131513
15141514static LogicalResult copyFirstPrivateVars (
1515- llvm::IRBuilderBase &builder, LLVM::ModuleTranslation &moduleTranslation,
1515+ mlir::Operation *op, llvm::IRBuilderBase &builder,
1516+ LLVM::ModuleTranslation &moduleTranslation,
15161517 SmallVectorImpl<mlir::Value> &mlirPrivateVars,
15171518 ArrayRef<llvm::Value *> llvmPrivateVars,
1518- SmallVectorImpl<omp::PrivateClauseOp> &privateDecls,
1519+ SmallVectorImpl<omp::PrivateClauseOp> &privateDecls, bool insertBarrier,
15191520 llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
15201521 // Apply copy region for firstprivate.
15211522 bool needsFirstprivate =
@@ -1563,6 +1564,14 @@ static LogicalResult copyFirstPrivateVars(
15631564 moduleTranslation.forgetMapping (copyRegion);
15641565 }
15651566
1567+ if (insertBarrier) {
1568+ llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder ();
1569+ llvm::OpenMPIRBuilder::InsertPointOrErrorTy res =
1570+ ompBuilder->createBarrier (builder.saveIP (), llvm::omp::OMPD_barrier);
1571+ if (failed (handleError (res, *op)))
1572+ return failure ();
1573+ }
1574+
15661575 return success ();
15671576}
15681577
@@ -2171,8 +2180,9 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
21712180 // firstprivate copy region
21722181 setInsertPointForPossiblyEmptyBlock (builder, copyBlock);
21732182 if (failed (copyFirstPrivateVars (
2174- builder, moduleTranslation, privateVarsInfo.mlirVars ,
2175- taskStructMgr.getLLVMPrivateVarGEPs (), privateVarsInfo.privatizers )))
2183+ taskOp, builder, moduleTranslation, privateVarsInfo.mlirVars ,
2184+ taskStructMgr.getLLVMPrivateVarGEPs (), privateVarsInfo.privatizers ,
2185+ taskOp.getPrivateNeedsBarrier ())))
21762186 return llvm::failure ();
21772187
21782188 // Set up for call to createTask()
@@ -2392,8 +2402,9 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
23922402 return failure ();
23932403
23942404 if (failed (copyFirstPrivateVars (
2395- builder, moduleTranslation, privateVarsInfo.mlirVars ,
2396- privateVarsInfo.llvmVars , privateVarsInfo.privatizers )))
2405+ wsloopOp, builder, moduleTranslation, privateVarsInfo.mlirVars ,
2406+ privateVarsInfo.llvmVars , privateVarsInfo.privatizers ,
2407+ wsloopOp.getPrivateNeedsBarrier ())))
23972408 return failure ();
23982409
23992410 assert (afterAllocas.get ()->getSinglePredecessor ());
@@ -2512,8 +2523,9 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
25122523 return llvm::make_error<PreviouslyReportedError>();
25132524
25142525 if (failed (copyFirstPrivateVars (
2515- builder, moduleTranslation, privateVarsInfo.mlirVars ,
2516- privateVarsInfo.llvmVars , privateVarsInfo.privatizers )))
2526+ opInst, builder, moduleTranslation, privateVarsInfo.mlirVars ,
2527+ privateVarsInfo.llvmVars , privateVarsInfo.privatizers ,
2528+ opInst.getPrivateNeedsBarrier ())))
25172529 return llvm::make_error<PreviouslyReportedError>();
25182530
25192531 if (failed (
@@ -4461,8 +4473,9 @@ convertOmpDistribute(Operation &opInst, llvm::IRBuilderBase &builder,
44614473 return llvm::make_error<PreviouslyReportedError>();
44624474
44634475 if (failed (copyFirstPrivateVars (
4464- builder, moduleTranslation, privVarsInfo.mlirVars ,
4465- privVarsInfo.llvmVars , privVarsInfo.privatizers )))
4476+ distributeOp, builder, moduleTranslation, privVarsInfo.mlirVars ,
4477+ privVarsInfo.llvmVars , privVarsInfo.privatizers ,
4478+ distributeOp.getPrivateNeedsBarrier ())))
44664479 return llvm::make_error<PreviouslyReportedError>();
44674480
44684481 llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder ();
@@ -5222,9 +5235,9 @@ convertOmpTarget(Operation &opInst, llvm::IRBuilderBase &builder,
52225235 return llvm::make_error<PreviouslyReportedError>();
52235236
52245237 if (failed (copyFirstPrivateVars (
5225- builder, moduleTranslation, privateVarsInfo.mlirVars ,
5238+ targetOp, builder, moduleTranslation, privateVarsInfo.mlirVars ,
52265239 privateVarsInfo.llvmVars , privateVarsInfo.privatizers ,
5227- &mappedPrivateVars)))
5240+ targetOp. getPrivateNeedsBarrier (), &mappedPrivateVars)))
52285241 return llvm::make_error<PreviouslyReportedError>();
52295242
52305243 SmallVector<Region *> privateCleanupRegions;
0 commit comments