[Mlir-commits] [flang] [llvm] [mlir] [mlir][OpenMP] - MLIR to LLVMIR translation support for delayed privatization of allocatables in `omp.target` ops (PR #116576)
Sergio Afonso
llvmlistbot at llvm.org
Wed Dec 11 07:43:33 PST 2024
================
@@ -3869,50 +3966,53 @@ convertOmpTarget(Operation &opInst, llvm::IRBuilderBase &builder,
// Do privatization after moduleTranslation has already recorded
// mapped values.
- if (!targetOp.getPrivateVars().empty()) {
- builder.restoreIP(allocaIP);
-
- OperandRange privateVars = targetOp.getPrivateVars();
- std::optional<ArrayAttr> privateSyms = targetOp.getPrivateSyms();
- MutableArrayRef<BlockArgument> privateBlockArgs =
- cast<omp::BlockArgOpenMPOpInterface>(opInst).getPrivateBlockArgs();
-
- for (auto [privVar, privatizerNameAttr, privBlockArg] :
- llvm::zip_equal(privateVars, *privateSyms, privateBlockArgs)) {
-
- SymbolRefAttr privSym = cast<SymbolRefAttr>(privatizerNameAttr);
- omp::PrivateClauseOp privatizer = findPrivatizer(&opInst, privSym);
- assert(privatizer.getDataSharingType() !=
- omp::DataSharingClauseType::FirstPrivate &&
- privatizer.getDeallocRegion().empty() &&
- "unsupported privatizer");
- moduleTranslation.mapValue(privatizer.getAllocMoldArg(),
- moduleTranslation.lookupValue(privVar));
- Region &allocRegion = privatizer.getAllocRegion();
- SmallVector<llvm::Value *, 1> yieldedValues;
- if (failed(inlineConvertOmpRegions(
- allocRegion, "omp.targetop.privatizer", builder,
- moduleTranslation, &yieldedValues))) {
- return llvm::createStringError(
- "failed to inline `alloc` region of `omp.private`");
- }
- assert(yieldedValues.size() == 1);
- moduleTranslation.mapValue(privBlockArg, yieldedValues.front());
- moduleTranslation.forgetMapping(allocRegion);
- builder.restoreIP(builder.saveIP());
- }
- }
+ MutableArrayRef<BlockArgument> privateBlockArgs =
+ cast<omp::BlockArgOpenMPOpInterface>(opInst).getPrivateBlockArgs();
+ SmallVector<mlir::Value> mlirPrivateVars;
+ SmallVector<llvm::Value *> llvmPrivateVars;
+ SmallVector<omp::PrivateClauseOp> privateDecls;
+ mlirPrivateVars.reserve(privateBlockArgs.size());
+ llvmPrivateVars.reserve(privateBlockArgs.size());
+ collectPrivatizationDecls(targetOp, privateDecls);
+ for (mlir::Value privateVar : targetOp.getPrivateVars())
+ mlirPrivateVars.push_back(privateVar);
+
+ llvm::Expected<llvm::BasicBlock *> afterAllocas =
+ allocatePrivateVars(builder, moduleTranslation, privateBlockArgs,
+ privateDecls, mlirPrivateVars, llvmPrivateVars,
+ allocaIP, targetOp, &mappedPrivateVars);
+
+ if (handleError(afterAllocas, *targetOp).failed())
----------------
skatrak wrote:
Nit: This seems to be the preferred form here, but feel free to leave it unchanged.
```suggestion
if (failed(handleError(afterAllocas, *targetOp)))
```
https://github.com/llvm/llvm-project/pull/116576
More information about the Mlir-commits
mailing list