Skip to content

Commit bcbe5a7

Browse files
committed
[mlir][OpenMP] Add translation of private_barrier attr to LLVMIR
1 parent 5e2e1a7 commit bcbe5a7

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
@@ -1512,10 +1512,11 @@ allocatePrivateVars(llvm::IRBuilderBase &builder,
15121512
}
15131513

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

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)