Skip to content

Commit 8d06d4c

Browse files
authored
[mlir][OpenMP] Add translation of private_barrier attr to LLVMIR (#140090)
Part of a series to fix #136357
1 parent a24ed7d commit 8d06d4c

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1651,10 +1651,11 @@ allocatePrivateVars(llvm::IRBuilderBase &builder,
16511651
}
16521652

16531653
static 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;

mlir/test/Target/LLVMIR/openmp-wsloop-private.mlir

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ llvm.func @wsloop_private_(%arg0: !llvm.ptr {fir.bindc_name = "y"}) attributes {
3737
%7 = llvm.mlir.constant(10 : i32) : i32
3838
%8 = llvm.mlir.constant(0 : i32) : i32
3939
omp.parallel {
40-
omp.wsloop private(@_QFwsloop_privateEc_firstprivate_ref_c8 %5 -> %arg1, @_QFwsloop_privateEi_private_ref_i32 %3 -> %arg2 : !llvm.ptr, !llvm.ptr) reduction(@max_f32 %1 -> %arg3 : !llvm.ptr) {
40+
omp.wsloop private(@_QFwsloop_privateEc_firstprivate_ref_c8 %5 -> %arg1, @_QFwsloop_privateEi_private_ref_i32 %3 -> %arg2 : !llvm.ptr, !llvm.ptr) private_barrier reduction(@max_f32 %1 -> %arg3 : !llvm.ptr) {
4141
omp.loop_nest (%arg4) : i32 = (%8) to (%7) inclusive step (%6) {
4242
omp.yield
4343
}
@@ -66,6 +66,8 @@ llvm.func @wsloop_private_(%arg0: !llvm.ptr {fir.bindc_name = "y"}) attributes {
6666
// CHECK: [[PRIVATE_CPY_BB:.*]]:
6767
// CHECK: %[[CHR_VAL:.*]] = load [1 x i8], ptr %{{.*}}, align 1
6868
// CHECK: store [1 x i8] %[[CHR_VAL]], ptr %[[CHR]], align 1
69+
// CHECK: %[[THREAD_NUM:.*]] = call i32 @__kmpc_global_thread_num({{.*}})
70+
// CHECK: call void @__kmpc_barrier({{.*}}, i32 %[[THREAD_NUM]])
6971
// CHECK: br label %[[RED_INIT_BB:.*]]
7072

7173
// Third, check that reduction init took place.

0 commit comments

Comments
 (0)