@@ -1651,10 +1651,11 @@ allocatePrivateVars(llvm::IRBuilderBase &builder,
1651
1651
}
1652
1652
1653
1653
static LogicalResult copyFirstPrivateVars (
1654
- llvm::IRBuilderBase &builder, LLVM::ModuleTranslation &moduleTranslation,
1654
+ mlir::Operation *op, llvm::IRBuilderBase &builder,
1655
+ LLVM::ModuleTranslation &moduleTranslation,
1655
1656
SmallVectorImpl<mlir::Value> &mlirPrivateVars,
1656
1657
ArrayRef<llvm::Value *> llvmPrivateVars,
1657
- SmallVectorImpl<omp::PrivateClauseOp> &privateDecls,
1658
+ SmallVectorImpl<omp::PrivateClauseOp> &privateDecls, bool insertBarrier,
1658
1659
llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr ) {
1659
1660
// Apply copy region for firstprivate.
1660
1661
bool needsFirstprivate =
@@ -1702,6 +1703,14 @@ static LogicalResult copyFirstPrivateVars(
1702
1703
moduleTranslation.forgetMapping (copyRegion);
1703
1704
}
1704
1705
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
+
1705
1714
return success ();
1706
1715
}
1707
1716
@@ -2310,8 +2319,9 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
2310
2319
// firstprivate copy region
2311
2320
setInsertPointForPossiblyEmptyBlock (builder, copyBlock);
2312
2321
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 ())))
2315
2325
return llvm::failure ();
2316
2326
2317
2327
// Set up for call to createTask()
@@ -2531,8 +2541,9 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
2531
2541
return failure ();
2532
2542
2533
2543
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 ())))
2536
2547
return failure ();
2537
2548
2538
2549
assert (afterAllocas.get ()->getSinglePredecessor ());
@@ -2692,8 +2703,9 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
2692
2703
return llvm::make_error<PreviouslyReportedError>();
2693
2704
2694
2705
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 ())))
2697
2709
return llvm::make_error<PreviouslyReportedError>();
2698
2710
2699
2711
if (failed (
@@ -4657,8 +4669,9 @@ convertOmpDistribute(Operation &opInst, llvm::IRBuilderBase &builder,
4657
4669
return llvm::make_error<PreviouslyReportedError>();
4658
4670
4659
4671
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 ())))
4662
4675
return llvm::make_error<PreviouslyReportedError>();
4663
4676
4664
4677
llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder ();
@@ -5422,9 +5435,9 @@ convertOmpTarget(Operation &opInst, llvm::IRBuilderBase &builder,
5422
5435
return llvm::make_error<PreviouslyReportedError>();
5423
5436
5424
5437
if (failed (copyFirstPrivateVars (
5425
- builder, moduleTranslation, privateVarsInfo.mlirVars ,
5438
+ targetOp, builder, moduleTranslation, privateVarsInfo.mlirVars ,
5426
5439
privateVarsInfo.llvmVars , privateVarsInfo.privatizers ,
5427
- &mappedPrivateVars)))
5440
+ targetOp. getPrivateNeedsBarrier (), &mappedPrivateVars)))
5428
5441
return llvm::make_error<PreviouslyReportedError>();
5429
5442
5430
5443
SmallVector<Region *> privateCleanupRegions;
0 commit comments