Author: Matt Arsenault Date: 2023-01-30T15:03:14-04:00 New Revision: 52c28d7cf9018f3558268217f6cf91271eb4ac39
URL: https://github.com/llvm/llvm-project/commit/52c28d7cf9018f3558268217f6cf91271eb4ac39 DIFF: https://github.com/llvm/llvm-project/commit/52c28d7cf9018f3558268217f6cf91271eb4ac39.diff LOG: clang/OpenCL: Don't use a Function for the block type The AMDGPU value for this is not really a function. Currently we're emitting IR that isn't true to what will eventually be emitted. Added: Modified: clang/lib/CodeGen/CGBuiltin.cpp clang/lib/CodeGen/CGOpenCLRuntime.cpp clang/lib/CodeGen/CGOpenCLRuntime.h clang/lib/CodeGen/TargetInfo.cpp clang/lib/CodeGen/TargetInfo.h Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index bf23774c3fe12..76c4b7ed88d13 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -4923,7 +4923,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, auto Info = CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(3)); llvm::Value *Kernel = - Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy); + Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); llvm::Value *Block = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); @@ -4977,7 +4977,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, auto Info = CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(3)); llvm::Value *Kernel = - Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy); + Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); auto *Block = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); llvm::Value *ElemPtr, *TmpSize, *TmpPtr; std::tie(ElemPtr, TmpSize, TmpPtr) = CreateArrayForSizeVar(4); @@ -5034,7 +5034,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, auto Info = CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(6)); llvm::Value *Kernel = - Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy); + Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); llvm::Value *Block = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); @@ -5084,7 +5084,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, getContext().getTargetAddressSpace(LangAS::opencl_generic)); auto Info = CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(0)); - Value *Kernel = Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy); + Value *Kernel = + Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); Value *Arg = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); return RValue::get(EmitRuntimeCall( CGM.CreateRuntimeFunction( @@ -5098,7 +5099,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, getContext().getTargetAddressSpace(LangAS::opencl_generic)); auto Info = CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(0)); - Value *Kernel = Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy); + Value *Kernel = + Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); Value *Arg = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); return RValue::get(EmitRuntimeCall( CGM.CreateRuntimeFunction( @@ -5115,7 +5117,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, llvm::Value *NDRange = NDRangeL.getAddress(*this).getPointer(); auto Info = CGM.getOpenCLRuntime().emitOpenCLEnqueuedBlock(*this, E->getArg(1)); - Value *Kernel = Builder.CreatePointerCast(Info.Kernel, GenericVoidPtrTy); + Value *Kernel = + Builder.CreatePointerCast(Info.KernelHandle, GenericVoidPtrTy); Value *Block = Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy); const char *Name = BuiltinID == Builtin::BIget_kernel_max_sub_group_size_for_ndrange diff --git a/clang/lib/CodeGen/CGOpenCLRuntime.cpp b/clang/lib/CodeGen/CGOpenCLRuntime.cpp index ab8de7ecf50c4..5a5d7a4d18c57 100644 --- a/clang/lib/CodeGen/CGOpenCLRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenCLRuntime.cpp @@ -156,7 +156,7 @@ void CGOpenCLRuntime::recordBlockInfo(const BlockExpr *E, EnqueuedBlockMap[E].InvokeFunc = InvokeF; EnqueuedBlockMap[E].BlockArg = Block; EnqueuedBlockMap[E].BlockTy = BlockTy; - EnqueuedBlockMap[E].Kernel = nullptr; + EnqueuedBlockMap[E].KernelHandle = nullptr; } llvm::Function *CGOpenCLRuntime::getInvokeFunction(const Expr *E) { @@ -175,7 +175,7 @@ CGOpenCLRuntime::emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, const Expr *E) { "Block expression not emitted"); // Do not emit the block wrapper again if it has been emitted. - if (EnqueuedBlockMap[Block].Kernel) { + if (EnqueuedBlockMap[Block].KernelHandle) { return EnqueuedBlockMap[Block]; } @@ -183,9 +183,6 @@ CGOpenCLRuntime::emitOpenCLEnqueuedBlock(CodeGenFunction &CGF, const Expr *E) { CGF, EnqueuedBlockMap[Block].InvokeFunc, EnqueuedBlockMap[Block].BlockTy); // The common part of the post-processing of the kernel goes here. - F->addFnAttr(llvm::Attribute::NoUnwind); - F->setCallingConv( - CGF.getTypes().ClangCallConvToLLVMCallConv(CallingConv::CC_OpenCLKernel)); - EnqueuedBlockMap[Block].Kernel = F; + EnqueuedBlockMap[Block].KernelHandle = F; return EnqueuedBlockMap[Block]; } diff --git a/clang/lib/CodeGen/CGOpenCLRuntime.h b/clang/lib/CodeGen/CGOpenCLRuntime.h index 900644b3b93bd..b93e2041c8f16 100644 --- a/clang/lib/CodeGen/CGOpenCLRuntime.h +++ b/clang/lib/CodeGen/CGOpenCLRuntime.h @@ -44,7 +44,7 @@ class CGOpenCLRuntime { /// Structure for enqueued block information. struct EnqueuedBlockInfo { llvm::Function *InvokeFunc; /// Block invoke function. - llvm::Function *Kernel; /// Enqueued block kernel. + llvm::Value *KernelHandle; /// Enqueued block kernel reference. llvm::Value *BlockArg; /// The first argument to enqueued block kernel. llvm::Type *BlockTy; /// Type of the block argument. }; diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 77db1153e1dd8..1b80529e36a72 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -9458,10 +9458,9 @@ class AMDGPUTargetCodeGenInfo : public TargetCodeGenInfo { SyncScope Scope, llvm::AtomicOrdering Ordering, llvm::LLVMContext &Ctx) const override; - llvm::Function * - createEnqueuedBlockKernel(CodeGenFunction &CGF, - llvm::Function *BlockInvokeFunc, - llvm::Type *BlockTy) const override; + llvm::Value *createEnqueuedBlockKernel(CodeGenFunction &CGF, + llvm::Function *BlockInvokeFunc, + llvm::Type *BlockTy) const override; bool shouldEmitStaticExternCAliases() const override; void setCUDAKernelCallingConvention(const FunctionType *&FT) const override; }; @@ -12429,10 +12428,8 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { /// The kernel has the same function type as the block invoke function. Its /// name is the name of the block invoke function postfixed with "_kernel". /// It simply calls the block invoke function then returns. -llvm::Function * -TargetCodeGenInfo::createEnqueuedBlockKernel(CodeGenFunction &CGF, - llvm::Function *Invoke, - llvm::Type *BlockTy) const { +llvm::Value *TargetCodeGenInfo::createEnqueuedBlockKernel( + CodeGenFunction &CGF, llvm::Function *Invoke, llvm::Type *BlockTy) const { auto *InvokeFT = Invoke->getFunctionType(); auto &C = CGF.getLLVMContext(); std::string Name = Invoke->getName().str() + "_kernel"; @@ -12440,13 +12437,21 @@ TargetCodeGenInfo::createEnqueuedBlockKernel(CodeGenFunction &CGF, InvokeFT->params(), false); auto *F = llvm::Function::Create(FT, llvm::GlobalValue::ExternalLinkage, Name, &CGF.CGM.getModule()); + llvm::CallingConv::ID KernelCC = + CGF.getTypes().ClangCallConvToLLVMCallConv(CallingConv::CC_OpenCLKernel); + F->setCallingConv(KernelCC); + auto IP = CGF.Builder.saveIP(); auto *BB = llvm::BasicBlock::Create(C, "entry", F); auto &Builder = CGF.Builder; Builder.SetInsertPoint(BB); llvm::SmallVector<llvm::Value *, 2> Args(llvm::make_pointer_range(F->args())); - llvm::CallInst *call = Builder.CreateCall(Invoke, Args); - call->setCallingConv(Invoke->getCallingConv()); + llvm::CallInst *Call = Builder.CreateCall(Invoke, Args); + Call->setCallingConv(Invoke->getCallingConv()); + + // FIXME: Apply default attributes + F->addFnAttr(llvm::Attribute::NoUnwind); + Builder.CreateRetVoid(); Builder.restoreIP(IP); return F; @@ -12460,9 +12465,8 @@ TargetCodeGenInfo::createEnqueuedBlockKernel(CodeGenFunction &CGF, /// allocates the same type of struct on stack and stores the block literal /// to it and passes its pointer to the block invoke function. The kernel /// has "enqueued-block" function attribute and kernel argument metadata. -llvm::Function *AMDGPUTargetCodeGenInfo::createEnqueuedBlockKernel( - CodeGenFunction &CGF, llvm::Function *Invoke, - llvm::Type *BlockTy) const { +llvm::Value *AMDGPUTargetCodeGenInfo::createEnqueuedBlockKernel( + CodeGenFunction &CGF, llvm::Function *Invoke, llvm::Type *BlockTy) const { auto &Builder = CGF.Builder; auto &C = CGF.getLLVMContext(); @@ -12496,7 +12500,12 @@ llvm::Function *AMDGPUTargetCodeGenInfo::createEnqueuedBlockKernel( auto *FT = llvm::FunctionType::get(llvm::Type::getVoidTy(C), ArgTys, false); auto *F = llvm::Function::Create(FT, llvm::GlobalValue::InternalLinkage, Name, &CGF.CGM.getModule()); + F->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL); + + // FIXME: Apply default attributes + F->addFnAttr(llvm::Attribute::NoUnwind); F->addFnAttr("enqueued-block"); + auto IP = CGF.Builder.saveIP(); auto *BB = llvm::BasicBlock::Create(C, "entry", F); Builder.SetInsertPoint(BB); diff --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h index c7c1ec7fce7e3..abd568e09baaf 100644 --- a/clang/lib/CodeGen/TargetInfo.h +++ b/clang/lib/CodeGen/TargetInfo.h @@ -339,7 +339,7 @@ class TargetCodeGenInfo { /// convention and ABI as an OpenCL kernel. The wrapper function accepts /// block context and block arguments in target-specific way and calls /// the original block invoke function. - virtual llvm::Function * + virtual llvm::Value * createEnqueuedBlockKernel(CodeGenFunction &CGF, llvm::Function *BlockInvokeFunc, llvm::Type *BlockTy) const; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits