[flang-commits] [flang] [mlir] [flang][OpenMP] Enable delayed privatizaiton by defualt `omp.wsloop` (PR #122471)
Sergio Afonso via flang-commits
flang-commits at lists.llvm.org
Mon Jan 13 05:30:02 PST 2025
================
@@ -1874,6 +1874,60 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
llvm::OpenMPIRBuilder::InsertPointTy allocaIP =
findAllocaInsertPoint(builder, moduleTranslation);
+ // The following loop is workaround until we private ops' alloca regions to be
+ // "pure". See
+ // https://discourse.llvm.org/t/rfc-openmp-supporting-delayed-task-execution-with-firstprivate-variables/83084/7
+ // and https://discourse.llvm.org/t/delayed-privatization-for-omp-wsloop/83989
+ // for more info.
+ for (auto [privateVar, privateDeclOp] :
+ llvm::zip_equal(mlirPrivateVars, privateDecls)) {
+ llvm::Value *llvmValue = moduleTranslation.lookupValue(privateVar);
+ bool isAllocArgUsed =
+ !privateDeclOp.getAllocRegion().args_begin()->use_empty();
+
+ // If the alloc region argument is not used, we can skip the workaround.
+ if (!isAllocArgUsed)
+ continue;
+
+ llvm::Instruction *definingInst =
+ llvm::dyn_cast<llvm::Instruction>(llvmValue);
+
+ // If the alloc region argument is not defined by an op, it has to dominate
+ // the current alloc IP. So we skip the workaround.
+ if (!definingInst)
+ continue;
+
+ llvm::Function *definingFun = definingInst->getParent()->getParent();
+ llvm::Function *allocaFun = allocaIP.getBlock()->getParent();
+
+ // If the alloc region argument is defined in a different function that
+ // current one where allocs are being inserted (for example, we are building
+ // the outlined function of a target region), we skip the workaround.
+ if (definingFun != allocaFun)
+ continue;
+
+ llvm::DominatorTree dt(*definingFun);
+ // If the defining instruction of the alloc region argument dominates the
+ // alloca insertion point already, we can skip the workaround.
+ if (dt.dominates(definingInst, allocaIP.getPoint()))
+ continue;
+
+ llvm::BasicBlock *definingBlock = definingInst->getParent();
----------------
skatrak wrote:
Nit: Since it's also part of the initialization of `definingFun`, this can be moved up and reused.
https://github.com/llvm/llvm-project/pull/122471
More information about the flang-commits
mailing list