[llvm] [mlir] [OMPIRBuilder] - Make offloading input data persist for deferred target tasks (PR #133499)
Sergio Afonso via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 13 08:48:37 PDT 2025
================
@@ -7150,15 +7150,55 @@ static Expected<Function *> createOutlinedFunction(
ValueReplacementMap);
return Func;
}
+/// Given a task descriptor, TaskWithPrivates, return the pointer to the block
+/// of pointers containing shared data between the parent task and the created
+/// task.
+static LoadInst *loadSharedDataFromTaskDescriptor(OpenMPIRBuilder &OMPIRBuilder,
+ IRBuilderBase &Builder,
+ Value *TaskWithPrivates,
+ Type *TaskWithPrivatesTy) {
+ Type *TaskTy = OMPIRBuilder.Task;
+ LLVMContext &Ctx = Builder.getContext();
+ Value *TaskT =
+ Builder.CreateStructGEP(TaskWithPrivatesTy, TaskWithPrivates, 0);
+ Value *Shareds = TaskT;
+ // TaskWithPrivatesTy can be one of the following
+ // 1. %struct.task_with_privates = type { %struct.kmp_task_ompbuilder_t,
+ // %struct.privates }
+ // 2. %struct.kmp_task_ompbuilder_t ;; This is simply TaskTy
+ //
+ // In the former case, that is when TaskWithPrivatesTy != TaskTy,
+ // its first member has to be the task descriptor. TaskTy is the type of the
+ // task descriptor. TaskT is the pointer to the task descriptor. Loading the
+ // first member of TaskT, gives us the pointer to shared data.
+ if (TaskWithPrivatesTy != TaskTy)
+ Shareds = Builder.CreateStructGEP(TaskTy, TaskT, 0);
+ return Builder.CreateLoad(PointerType::getUnqual(Ctx), Shareds);
+}
/// Create an entry point for a target task with the following.
/// It'll have the following signature
/// void @.omp_target_task_proxy_func(i32 %thread.id, ptr %task)
/// This function is called from emitTargetTask once the
/// code to launch the target kernel has been outlined already.
-static Function *emitTargetTaskProxyFunction(OpenMPIRBuilder &OMPBuilder,
- IRBuilderBase &Builder,
- CallInst *StaleCI) {
+/// NumOffloadingArrays is the number of offloading arrays that we need to copy
+/// into the task structure so that the deferred target task can access this
+/// data even after the stack frame of the generating task has been rolled
+/// back. Offloading arrays contain base pointers, pointers, sizes etc
+/// of the data that the target kernel will access. These in effect are the
+/// non-empty arrays of pointers held by OpenMPIRBuilder::TargetDataRTArgs.
+static Function *emitTargetTaskProxyFunction(
+ OpenMPIRBuilder &OMPBuilder, IRBuilderBase &Builder, CallInst *StaleCI,
+ StructType *PrivatesTy, StructType *TaskWithPrivatesTy,
+ const size_t NumOffloadingArrays, const int SharedArgsOperandNo) {
+
+ // if NumOffloadingArrays is non-zero, PrivatesTy better not be nullptr
----------------
skatrak wrote:
```suggestion
// If NumOffloadingArrays is non-zero, PrivatesTy better not be nullptr.
```
https://github.com/llvm/llvm-project/pull/133499
More information about the llvm-commits
mailing list