llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-mlir-openmp Author: Tom Eccles (tblah) <details> <summary>Changes</summary> Part of a series to fix https://github.com/llvm/llvm-project/issues/136357 --- Full diff: https://github.com/llvm/llvm-project/pull/140090.diff 2 Files Affected: - (modified) mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp (+25-12) - (modified) mlir/test/Target/LLVMIR/openmp-wsloop-private.mlir (+3-1) ``````````diff diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp index 9f7b5605556e6..65d496ad8b774 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -1512,10 +1512,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 = @@ -1563,6 +1564,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(); } @@ -2171,8 +2180,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() @@ -2392,8 +2402,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()); @@ -2512,8 +2523,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( @@ -4461,8 +4473,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(); @@ -5222,9 +5235,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. `````````` </details> https://github.com/llvm/llvm-project/pull/140090 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits