From 297f0b3f4c05c6ef40183809eac5ccac9ca8c4ce Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Wed, 19 Mar 2025 10:11:18 -0700 Subject: [CudaSPIRV] Allow using integral non-type template parameters as attribute args (#131546) Allow using integral non-type template parameters as attribute arguments of reqd_work_group_size and work_group_size_hint. Test plan: ninja check-all --- clang/lib/CodeGen/CodeGenFunction.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp') diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index a7fdfa6..dcf523f 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -649,18 +649,24 @@ void CodeGenFunction::EmitKernelMetadata(const FunctionDecl *FD, } if (const WorkGroupSizeHintAttr *A = FD->getAttr()) { + auto Eval = [&](Expr *E) { + return E->EvaluateKnownConstInt(FD->getASTContext()).getExtValue(); + }; llvm::Metadata *AttrMDArgs[] = { - llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())), - llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())), - llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))}; + llvm::ConstantAsMetadata::get(Builder.getInt32(Eval(A->getXDim()))), + llvm::ConstantAsMetadata::get(Builder.getInt32(Eval(A->getYDim()))), + llvm::ConstantAsMetadata::get(Builder.getInt32(Eval(A->getZDim())))}; Fn->setMetadata("work_group_size_hint", llvm::MDNode::get(Context, AttrMDArgs)); } if (const ReqdWorkGroupSizeAttr *A = FD->getAttr()) { + auto Eval = [&](Expr *E) { + return E->EvaluateKnownConstInt(FD->getASTContext()).getExtValue(); + }; llvm::Metadata *AttrMDArgs[] = { - llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())), - llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())), - llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))}; + llvm::ConstantAsMetadata::get(Builder.getInt32(Eval(A->getXDim()))), + llvm::ConstantAsMetadata::get(Builder.getInt32(Eval(A->getYDim()))), + llvm::ConstantAsMetadata::get(Builder.getInt32(Eval(A->getZDim())))}; Fn->setMetadata("reqd_work_group_size", llvm::MDNode::get(Context, AttrMDArgs)); } -- cgit v1.1