diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -9967,7 +9967,7 @@ // Check the error code and execute the host version if required. CGF.Builder.restoreIP(OMPBuilder.emitTargetKernel( CGF.Builder, Return, RTLoc, DeviceID, NumTeams, NumThreads, - OutlinedFnID, KernelArgs)); + OutlinedFnID, KernelArgs, &CGF.CurFn->getEntryBlock())); llvm::BasicBlock *OffloadFailedBlock = CGF.createBasicBlock("omp_offload.failed"); diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h --- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -995,10 +995,12 @@ /// \param NumThreads Number of threads via the 'thread_limit' clause. /// \param HostPtr Pointer to the host-side pointer of the target kernel. /// \param KernelArgs Array of arguments to the kernel. + /// \param EntryBlock Entry basic block of the enclosing function. InsertPointTy emitTargetKernel(const LocationDescription &Loc, Value *&Return, Value *Ident, Value *DeviceID, Value *NumTeams, Value *NumThreads, Value *HostPtr, - ArrayRef KernelArgs); + ArrayRef KernelArgs, + llvm::BasicBlock *EntryBlock); /// Generate a barrier runtime call. /// diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -815,12 +815,18 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::emitTargetKernel( const LocationDescription &Loc, Value *&Return, Value *Ident, Value *DeviceID, Value *NumTeams, Value *NumThreads, Value *HostPtr, - ArrayRef KernelArgs) { + ArrayRef KernelArgs, llvm::BasicBlock *EntryBlock) { if (!updateToLocation(Loc)) return Loc.IP; - auto *KernelArgsPtr = - Builder.CreateAlloca(OpenMPIRBuilder::KernelArgs, nullptr, "kernel_args"); + // Insert the alloca at the start of the function entry block. + AllocaInst *KernelArgsPtr = nullptr; + { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.SetInsertPoint(EntryBlock, EntryBlock->begin()); + KernelArgsPtr = Builder.CreateAlloca(OpenMPIRBuilder::KernelArgs, nullptr, + "kernel_args"); + } for (unsigned I = 0, Size = KernelArgs.size(); I != Size; ++I) { llvm::Value *Arg = Builder.CreateStructGEP(OpenMPIRBuilder::KernelArgs, KernelArgsPtr, I);