https://github.com/sarnex updated https://github.com/llvm/llvm-project/pull/144728
>From da1523ec3b68d3d2a23f502df779c7e3f54320d0 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Wed, 18 Jun 2025 08:33:25 -0700 Subject: [PATCH 1/2] [clang][NFCI] Use TargetInfo to determine device kernel calling convention Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/lib/CodeGen/CGCall.cpp | 13 ++----------- clang/lib/CodeGen/TargetInfo.cpp | 8 ++++---- clang/lib/CodeGen/TargetInfo.h | 4 ++-- clang/lib/CodeGen/Targets/AMDGPU.cpp | 4 ++-- clang/lib/CodeGen/Targets/NVPTX.cpp | 2 +- clang/lib/CodeGen/Targets/SPIR.cpp | 4 ++-- 6 files changed, 13 insertions(+), 22 deletions(-) diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index a06455d25b1ef..fd75de42515da 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -83,17 +83,8 @@ unsigned CodeGenTypes::ClangCallConvToLLVMCallConv(CallingConv CC) { return llvm::CallingConv::AArch64_SVE_VectorCall; case CC_SpirFunction: return llvm::CallingConv::SPIR_FUNC; - case CC_DeviceKernel: { - if (CGM.getLangOpts().OpenCL) - return CGM.getTargetCodeGenInfo().getOpenCLKernelCallingConv(); - if (CGM.getTriple().isSPIROrSPIRV()) - return llvm::CallingConv::SPIR_KERNEL; - if (CGM.getTriple().isAMDGPU()) - return llvm::CallingConv::AMDGPU_KERNEL; - if (CGM.getTriple().isNVPTX()) - return llvm::CallingConv::PTX_Kernel; - llvm_unreachable("Unknown kernel calling convention"); - } + case CC_DeviceKernel: + return CGM.getTargetCodeGenInfo().getDeviceKernelCallingConv(); case CC_PreserveMost: return llvm::CallingConv::PreserveMost; case CC_PreserveAll: diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index f3df92c44bb6b..bc771c45951b3 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -103,11 +103,11 @@ TargetCodeGenInfo::getDependentLibraryOption(llvm::StringRef Lib, Opt += Lib; } -unsigned TargetCodeGenInfo::getOpenCLKernelCallingConv() const { - // OpenCL kernels are called via an explicit runtime API with arguments - // set with clSetKernelArg(), not as normal sub-functions. +unsigned TargetCodeGenInfo::getDeviceKernelCallingConv() const { + // Device kernels are called via an explicit runtime API with arguments, + // such as set with clSetKernelArg() for OpenCL, not as normal sub-functions. // Return SPIR_KERNEL by default as the kernel calling convention to - // ensure the fingerprint is fixed such way that each OpenCL argument + // ensure the fingerprint is fixed such way that each kernel argument // gets one matching argument in the produced kernel function argument // list to enable feasible implementation of clSetKernelArg() with // aggregates etc. In case we would use the default C calling conv here, diff --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h index 2783e222eb802..b4057d369f988 100644 --- a/clang/lib/CodeGen/TargetInfo.h +++ b/clang/lib/CodeGen/TargetInfo.h @@ -298,8 +298,8 @@ class TargetCodeGenInfo { llvm::StringRef Value, llvm::SmallString<32> &Opt) const {} - /// Get LLVM calling convention for OpenCL kernel. - virtual unsigned getOpenCLKernelCallingConv() const; + /// Get LLVM calling convention for device kernels. + virtual unsigned getDeviceKernelCallingConv() const; /// Get target specific null pointer. /// \param T is the LLVM type of the null pointer. diff --git a/clang/lib/CodeGen/Targets/AMDGPU.cpp b/clang/lib/CodeGen/Targets/AMDGPU.cpp index 8660373c3927f..47a552a7bf495 100644 --- a/clang/lib/CodeGen/Targets/AMDGPU.cpp +++ b/clang/lib/CodeGen/Targets/AMDGPU.cpp @@ -304,7 +304,7 @@ class AMDGPUTargetCodeGenInfo : public TargetCodeGenInfo { void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const override; - unsigned getOpenCLKernelCallingConv() const override; + unsigned getDeviceKernelCallingConv() const override; llvm::Constant *getNullPointer(const CodeGen::CodeGenModule &CGM, llvm::PointerType *T, QualType QT) const override; @@ -431,7 +431,7 @@ void AMDGPUTargetCodeGenInfo::setTargetAttributes( F->addFnAttr("amdgpu-ieee", "false"); } -unsigned AMDGPUTargetCodeGenInfo::getOpenCLKernelCallingConv() const { +unsigned AMDGPUTargetCodeGenInfo::getDeviceKernelCallingConv() const { return llvm::CallingConv::AMDGPU_KERNEL; } diff --git a/clang/lib/CodeGen/Targets/NVPTX.cpp b/clang/lib/CodeGen/Targets/NVPTX.cpp index ad802c9131de0..82bdfe2666b52 100644 --- a/clang/lib/CodeGen/Targets/NVPTX.cpp +++ b/clang/lib/CodeGen/Targets/NVPTX.cpp @@ -78,7 +78,7 @@ class NVPTXTargetCodeGenInfo : public TargetCodeGenInfo { return true; } - unsigned getOpenCLKernelCallingConv() const override { + unsigned getDeviceKernelCallingConv() const override { return llvm::CallingConv::PTX_Kernel; } diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp b/clang/lib/CodeGen/Targets/SPIR.cpp index 2f1e43cdc8cc3..afa23bffcd073 100644 --- a/clang/lib/CodeGen/Targets/SPIR.cpp +++ b/clang/lib/CodeGen/Targets/SPIR.cpp @@ -51,7 +51,7 @@ class CommonSPIRTargetCodeGenInfo : public TargetCodeGenInfo { getABIInfo().getDataLayout().getAllocaAddrSpace()); } - unsigned getOpenCLKernelCallingConv() const override; + unsigned getDeviceKernelCallingConv() const override; llvm::Type *getOpenCLType(CodeGenModule &CGM, const Type *T) const override; llvm::Type * getHLSLType(CodeGenModule &CGM, const Type *Ty, @@ -219,7 +219,7 @@ void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI) { } } -unsigned CommonSPIRTargetCodeGenInfo::getOpenCLKernelCallingConv() const { +unsigned CommonSPIRTargetCodeGenInfo::getDeviceKernelCallingConv() const { return llvm::CallingConv::SPIR_KERNEL; } >From 039b159b8149a53cb3ed2acc23b414133cfad14d Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Wed, 18 Jun 2025 11:28:27 -0700 Subject: [PATCH 2/2] rework base class behavior Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/lib/CodeGen/TargetInfo.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index bc771c45951b3..277d69daf493c 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -104,17 +104,20 @@ TargetCodeGenInfo::getDependentLibraryOption(llvm::StringRef Lib, } unsigned TargetCodeGenInfo::getDeviceKernelCallingConv() const { - // Device kernels are called via an explicit runtime API with arguments, - // such as set with clSetKernelArg() for OpenCL, not as normal sub-functions. - // Return SPIR_KERNEL by default as the kernel calling convention to - // ensure the fingerprint is fixed such way that each kernel argument - // gets one matching argument in the produced kernel function argument - // list to enable feasible implementation of clSetKernelArg() with - // aggregates etc. In case we would use the default C calling conv here, - // clSetKernelArg() might break depending on the target-specific - // conventions; different targets might split structs passed as values - // to multiple function arguments etc. - return llvm::CallingConv::SPIR_KERNEL; + if (getABIInfo().getContext().getLangOpts().OpenCL) { + // Device kernels are called via an explicit runtime API with arguments, + // such as set with clSetKernelArg() for OpenCL, not as normal + // sub-functions. Return SPIR_KERNEL by default as the kernel calling + // convention to ensure the fingerprint is fixed such way that each kernel + // argument gets one matching argument in the produced kernel function + // argument list to enable feasible implementation of clSetKernelArg() with + // aggregates etc. In case we would use the default C calling conv here, + // clSetKernelArg() might break depending on the target-specific + // conventions; different targets might split structs passed as values + // to multiple function arguments etc. + return llvm::CallingConv::SPIR_KERNEL; + } + llvm_unreachable("Unknown kernel calling convention"); } void TargetCodeGenInfo::setOCLKernelStubCallingConvention( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits