llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Joseph Huber (jhuber6) <details> <summary>Changes</summary> Summary: Currently we have some sema checks to make sure users don't apply kernel-only attributes to non-kernel functions. However, this currently did not correctly check for bare NVPTX / AMDGPU kernel attributes, making it impossible to use them at all w/o CUDA enabled. This patch fixes that by checking for the calling convention / attributes directly. --- Full diff: https://github.com/llvm/llvm-project/pull/104460.diff 2 Files Affected: - (modified) clang/lib/Sema/SemaDeclAttr.cpp (+5-2) - (modified) clang/test/CodeGenCXX/amdgpu-kernel-arg-pointer-type.cpp (+5) ``````````diff diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 3b5e984f4ee773..96c3759de7edc1 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -7147,7 +7147,9 @@ void Sema::ProcessDeclAttributeList( // good to have a way to specify "these attributes must appear as a group", // for these. Additionally, it would be good to have a way to specify "these // attribute must never appear as a group" for attributes like cold and hot. - if (!D->hasAttr<OpenCLKernelAttr>()) { + const FunctionType *FnTy = D->getFunctionType(); + if (!D->hasAttr<OpenCLKernelAttr>() && FnTy && + FnTy->getCallConv() != CallingConv::CC_AMDGPUKernelCall) { // These attributes cannot be applied to a non-kernel function. if (const auto *A = D->getAttr<ReqdWorkGroupSizeAttr>()) { // FIXME: This emits a different error message than @@ -7163,7 +7165,8 @@ void Sema::ProcessDeclAttributeList( } else if (const auto *A = D->getAttr<OpenCLIntelReqdSubGroupSizeAttr>()) { Diag(D->getLocation(), diag::err_opencl_kernel_attr) << A; D->setInvalidDecl(); - } else if (!D->hasAttr<CUDAGlobalAttr>()) { + } else if (!D->hasAttr<CUDAGlobalAttr>() && + !D->hasAttr<NVPTXKernelAttr>()) { if (const auto *A = D->getAttr<AMDGPUFlatWorkGroupSizeAttr>()) { Diag(D->getLocation(), diag::err_attribute_wrong_decl_type) << A << A->isRegularKeywordAttribute() << ExpectedKernelFunction; diff --git a/clang/test/CodeGenCXX/amdgpu-kernel-arg-pointer-type.cpp b/clang/test/CodeGenCXX/amdgpu-kernel-arg-pointer-type.cpp index c8fb12315d0eec..8df1d75e9ec8fa 100644 --- a/clang/test/CodeGenCXX/amdgpu-kernel-arg-pointer-type.cpp +++ b/clang/test/CodeGenCXX/amdgpu-kernel-arg-pointer-type.cpp @@ -6,6 +6,10 @@ // The original test passes the result through opt O2, but that seems to introduce invalid // addrspace casts which are not being fixed as part of the present change. +// COMMON: define{{.*}} amdgpu_kernel void @_Z6kernelv() #[[ATTR:[0-9]+]] +__attribute__((amdgpu_kernel, amdgpu_flat_work_group_size(1, 256))) void + kernel() {} + // COMMON-LABEL: define{{.*}} amdgpu_kernel void @_Z7kernel1Pi(ptr {{.*}} %x) // CHECK-NOT: ={{.*}} addrspacecast [[TYPE:.*]] addrspace(1)* %{{.*}} to ptr __attribute__((amdgpu_kernel)) void kernel1(int *x) { @@ -81,3 +85,4 @@ __attribute__((amdgpu_kernel)) void kernel8(struct SS a) { *a.x += 3.f; } +// COMMON: attributes #[[ATTR]] = { {{.*}}"amdgpu-flat-work-group-size"="1,256"{{.*}} } `````````` </details> https://github.com/llvm/llvm-project/pull/104460 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits