================ @@ -1796,36 +1918,110 @@ convertOmpTaskOp(omp::TaskOp taskOp, llvm::IRBuilderBase &builder, // Allocate and initialize private variables // TODO: package private variables up in a structure builder.SetInsertPoint(initBlock->getTerminator()); - for (auto [privDecl, mlirPrivVar, blockArg] : - llvm::zip_equal(privateDecls, mlirPrivateVars, privateBlockArgs)) { - llvm::Type *llvmAllocType = - moduleTranslation.convertType(privDecl.getType()); - // Allocations: - builder.SetInsertPoint(allocaIP.getBlock()->getTerminator()); - llvm::Value *llvmPrivateVar = builder.CreateAlloca( - llvmAllocType, /*ArraySize=*/nullptr, "omp.private.alloc"); + // Create task variable structure + llvm::SmallVector<llvm::Value *> privateVarAllocations; + taskStructMgr.generateTaskContextStruct(); + // GEPs so that we can initialize the variables. Don't use these GEPs inside + // of the body otherwise it will be the GEP not the struct which is fowarded + // to the outlined function. GEPs forwarded in this way are passed in a + // stack-allocated (by OpenMPIRBuilder) structure which is not safe for tasks + // which may not be executed until after the current stack frame goes out of + // scope. + taskStructMgr.createGEPsToPrivateVars(privateVarAllocations); + + for (auto [privDecl, mlirPrivVar, blockArg, llvmPrivateVarAlloc] : + llvm::zip_equal(privateDecls, mlirPrivateVars, privateBlockArgs, + privateVarAllocations)) { + if (!llvmPrivateVarAlloc) + // to be handled inside the task + continue; - // builder.SetInsertPoint(initBlock->getTerminator()); - auto err = + llvm::Expected<llvm::Value *> privateVarOrErr = initPrivateVar(builder, moduleTranslation, privDecl, mlirPrivVar, - blockArg, llvmPrivateVar, llvmPrivateVars, initBlock); - if (err) + blockArg, llvmPrivateVarAlloc, initBlock); + if (auto err = privateVarOrErr.takeError()) return handleError(std::move(err), *taskOp.getOperation()); + + llvm::IRBuilderBase::InsertPointGuard guard(builder); + builder.SetInsertPoint(builder.GetInsertBlock()->getTerminator()); ---------------- ergawy wrote:
Do we guarantee that the insertion block is terminated here? Should we handle the situation where it is not? https://github.com/llvm/llvm-project/pull/125307 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits