[Mlir-commits] [llvm] [mlir] [OMPIRBuilder] - Make offloading input data persist for deferred target tasks (PR #133499)
Sergio Afonso
llvmlistbot at llvm.org
Thu May 8 05:50:54 PDT 2025
================
@@ -7378,13 +7530,43 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitTargetTask(
TaskData = Builder.CreateCall(TaskAllocFn, TaskAllocArgs);
+ Align Alignment = TaskData->getPointerAlignment(M.getDataLayout());
if (HasShareds) {
- Value *Shareds = StaleCI->getArgOperand(1);
- Align Alignment = TaskData->getPointerAlignment(M.getDataLayout());
- Value *TaskShareds = Builder.CreateLoad(VoidPtr, TaskData);
+ Value *Shareds = StaleCI->getArgOperand(SharedArgOperandNo);
+ Value *TaskT = Builder.CreateStructGEP(TaskWithPrivatesTy, TaskData, 0);
+ Value *TaskSharedsPtr = TaskT;
+ if (TaskWithPrivatesTy != Task) {
+ TaskSharedsPtr = Builder.CreateStructGEP(Task, TaskT, 0);
+ }
+ Value *TaskShareds = Builder.CreateLoad(VoidPtr, TaskSharedsPtr);
+
Builder.CreateMemCpy(TaskShareds, Alignment, Shareds, Alignment,
SharedsSize);
}
+ if (OffloadingArraysToPrivatize.size()) {
+ Value *Privates =
+ Builder.CreateStructGEP(TaskWithPrivatesTy, TaskData, 1);
+ for (unsigned int i = 0; i < OffloadingArraysToPrivatize.size(); ++i) {
+ Value *PtrToPrivatize = OffloadingArraysToPrivatize[i];
+ Type *ArrayType = nullptr;
+ if (auto *GEP = dyn_cast<GetElementPtrInst>(PtrToPrivatize))
+ ArrayType = GEP->getSourceElementType();
+ else if (auto *Alloca = dyn_cast<AllocaInst>(PtrToPrivatize))
+ ArrayType = Alloca->getAllocatedType();
+ else
+ llvm_unreachable("Unhandled Instruction type");
+ assert(ArrayType && "ArrayType cannot be nullptr");
----------------
skatrak wrote:
Nit: This is duplicated from `createTaskWithPrivatesTy` and I believe it would be a good idea to refactor and reuse. That should make things much easier whenever adding support for the missing instruction types.
https://github.com/llvm/llvm-project/pull/133499
More information about the Mlir-commits
mailing list