[Mlir-commits] [mlir] 8d06d4c - [mlir][OpenMP] Add translation of private_barrier attr to LLVMIR (#140090)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu May 22 07:24:23 PDT 2025
Author: Tom Eccles
Date: 2025-05-22T15:24:20+01:00
New Revision: 8d06d4c1326ebd537f2219e0f0749945986cc8eb
URL: https://github.com/llvm/llvm-project/commit/8d06d4c1326ebd537f2219e0f0749945986cc8eb
DIFF: https://github.com/llvm/llvm-project/commit/8d06d4c1326ebd537f2219e0f0749945986cc8eb.diff
LOG: [mlir][OpenMP] Add translation of private_barrier attr to LLVMIR (#140090)
Part of a series to fix
https://github.com/llvm/llvm-project/issues/136357
Added:
Modified:
mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
mlir/test/Target/LLVMIR/openmp-wsloop-private.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index d4b2f4154ae53..4a6605e9c74cb 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -1651,10 +1651,11 @@ allocatePrivateVars(llvm::IRBuilderBase &builder,
}
static LogicalResult copyFirstPrivateVars(
- llvm::IRBuilderBase &builder, LLVM::ModuleTranslation &moduleTranslation,
+ mlir::Operation *op, llvm::IRBuilderBase &builder,
+ LLVM::ModuleTranslation &moduleTranslation,
SmallVectorImpl<mlir::Value> &mlirPrivateVars,
ArrayRef<llvm::Value *> llvmPrivateVars,
- SmallVectorImpl<omp::PrivateClauseOp> &privateDecls,
+ SmallVectorImpl<omp::PrivateClauseOp> &privateDecls, bool insertBarrier,
llvm::DenseMap<Value, Value> *mappedPrivateVars = nullptr) {
// Apply copy region for firstprivate.
bool needsFirstprivate =
@@ -1702,6 +1703,14 @@ static LogicalResult copyFirstPrivateVars(
moduleTranslation.forgetMapping(copyRegion);
}
+ if (insertBarrier) {
+ llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
+ llvm::OpenMPIRBuilder::InsertPointOrErrorTy res =
+ ompBuilder->createBarrier(builder.saveIP(), llvm::omp::OMPD_barrier);
+ if (failed(handleError(res, *op)))
+ return failure();
+ }
+
return success();
}
@@ -2310,8 +2319,9 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder,
// firstprivate copy region
setInsertPointForPossiblyEmptyBlock(builder, copyBlock);
if (failed(copyFirstPrivateVars(
- builder, moduleTranslation, privateVarsInfo.mlirVars,
- taskStructMgr.getLLVMPrivateVarGEPs(), privateVarsInfo.privatizers)))
+ taskOp, builder, moduleTranslation, privateVarsInfo.mlirVars,
+ taskStructMgr.getLLVMPrivateVarGEPs(), privateVarsInfo.privatizers,
+ taskOp.getPrivateNeedsBarrier())))
return llvm::failure();
// Set up for call to createTask()
@@ -2531,8 +2541,9 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
return failure();
if (failed(copyFirstPrivateVars(
- builder, moduleTranslation, privateVarsInfo.mlirVars,
- privateVarsInfo.llvmVars, privateVarsInfo.privatizers)))
+ wsloopOp, builder, moduleTranslation, privateVarsInfo.mlirVars,
+ privateVarsInfo.llvmVars, privateVarsInfo.privatizers,
+ wsloopOp.getPrivateNeedsBarrier())))
return failure();
assert(afterAllocas.get()->getSinglePredecessor());
@@ -2692,8 +2703,9 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
return llvm::make_error<PreviouslyReportedError>();
if (failed(copyFirstPrivateVars(
- builder, moduleTranslation, privateVarsInfo.mlirVars,
- privateVarsInfo.llvmVars, privateVarsInfo.privatizers)))
+ opInst, builder, moduleTranslation, privateVarsInfo.mlirVars,
+ privateVarsInfo.llvmVars, privateVarsInfo.privatizers,
+ opInst.getPrivateNeedsBarrier())))
return llvm::make_error<PreviouslyReportedError>();
if (failed(
@@ -4657,8 +4669,9 @@ convertOmpDistribute(Operation &opInst, llvm::IRBuilderBase &builder,
return llvm::make_error<PreviouslyReportedError>();
if (failed(copyFirstPrivateVars(
- builder, moduleTranslation, privVarsInfo.mlirVars,
- privVarsInfo.llvmVars, privVarsInfo.privatizers)))
+ distributeOp, builder, moduleTranslation, privVarsInfo.mlirVars,
+ privVarsInfo.llvmVars, privVarsInfo.privatizers,
+ distributeOp.getPrivateNeedsBarrier())))
return llvm::make_error<PreviouslyReportedError>();
llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
@@ -5422,9 +5435,9 @@ convertOmpTarget(Operation &opInst, llvm::IRBuilderBase &builder,
return llvm::make_error<PreviouslyReportedError>();
if (failed(copyFirstPrivateVars(
- builder, moduleTranslation, privateVarsInfo.mlirVars,
+ targetOp, builder, moduleTranslation, privateVarsInfo.mlirVars,
privateVarsInfo.llvmVars, privateVarsInfo.privatizers,
- &mappedPrivateVars)))
+ targetOp.getPrivateNeedsBarrier(), &mappedPrivateVars)))
return llvm::make_error<PreviouslyReportedError>();
SmallVector<Region *> privateCleanupRegions;
diff --git a/mlir/test/Target/LLVMIR/openmp-wsloop-private.mlir b/mlir/test/Target/LLVMIR/openmp-wsloop-private.mlir
index 23a0ae5713aa2..0b1f45ad7ce1c 100644
--- a/mlir/test/Target/LLVMIR/openmp-wsloop-private.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-wsloop-private.mlir
@@ -37,7 +37,7 @@ llvm.func @wsloop_private_(%arg0: !llvm.ptr {fir.bindc_name = "y"}) attributes {
%7 = llvm.mlir.constant(10 : i32) : i32
%8 = llvm.mlir.constant(0 : i32) : i32
omp.parallel {
- 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) {
+ 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) {
omp.loop_nest (%arg4) : i32 = (%8) to (%7) inclusive step (%6) {
omp.yield
}
@@ -66,6 +66,8 @@ llvm.func @wsloop_private_(%arg0: !llvm.ptr {fir.bindc_name = "y"}) attributes {
// CHECK: [[PRIVATE_CPY_BB:.*]]:
// CHECK: %[[CHR_VAL:.*]] = load [1 x i8], ptr %{{.*}}, align 1
// CHECK: store [1 x i8] %[[CHR_VAL]], ptr %[[CHR]], align 1
+// CHECK: %[[THREAD_NUM:.*]] = call i32 @__kmpc_global_thread_num({{.*}})
+// CHECK: call void @__kmpc_barrier({{.*}}, i32 %[[THREAD_NUM]])
// CHECK: br label %[[RED_INIT_BB:.*]]
// Third, check that reduction init took place.
More information about the Mlir-commits
mailing list