88
99#include " ABIInfoImpl.h"
1010#include " TargetInfo.h"
11+ #include " llvm/ADT/STLExtras.h"
1112#include " llvm/IR/IntrinsicsNVPTX.h"
1213
1314using namespace clang ;
@@ -78,7 +79,13 @@ class NVPTXTargetCodeGenInfo : public TargetCodeGenInfo {
7879 // Adds a NamedMDNode with GV, Name, and Operand as operands, and adds the
7980 // resulting MDNode to the nvvm.annotations MDNode.
8081 static void addNVVMMetadata (llvm::GlobalValue *GV, StringRef Name,
81- int Operand);
82+ int Operand,
83+ const SmallVectorImpl<int > &GridConstantArgs);
84+
85+ static void addNVVMMetadata (llvm::GlobalValue *GV, StringRef Name,
86+ int Operand) {
87+ addNVVMMetadata (GV, Name, Operand, SmallVector<int , 1 >(0 ));
88+ }
8289
8390private:
8491 static void emitBuiltinSurfTexDeviceCopy (CodeGenFunction &CGF, LValue Dst,
@@ -240,7 +247,8 @@ void NVPTXTargetCodeGenInfo::setTargetAttributes(
240247 }
241248
242249 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
243- if (!FD) return ;
250+ if (!FD)
251+ return ;
244252
245253 llvm::Function *F = cast<llvm::Function>(GV);
246254
@@ -263,8 +271,13 @@ void NVPTXTargetCodeGenInfo::setTargetAttributes(
263271 // __global__ functions cannot be called from the device, we do not
264272 // need to set the noinline attribute.
265273 if (FD->hasAttr <CUDAGlobalAttr>()) {
274+ SmallVector<int , 10 > GCI;
275+ for (auto IV : llvm::enumerate (FD->parameters ()))
276+ if (IV.value ()->hasAttr <CUDAGridConstantAttr>())
277+ // For some reason arg indices are 1-based in NVVM
278+ GCI.push_back (IV.index () + 1 );
266279 // Create !{<func-ref>, metadata !"kernel", i32 1} node
267- addNVVMMetadata (F, " kernel" , 1 );
280+ addNVVMMetadata (F, " kernel" , 1 , GCI );
268281 }
269282 if (CUDALaunchBoundsAttr *Attr = FD->getAttr <CUDALaunchBoundsAttr>())
270283 M.handleCUDALaunchBoundsAttr (F, Attr);
@@ -276,18 +289,27 @@ void NVPTXTargetCodeGenInfo::setTargetAttributes(
276289 }
277290}
278291
279- void NVPTXTargetCodeGenInfo::addNVVMMetadata (llvm::GlobalValue *GV,
280- StringRef Name, int Operand) {
292+ void NVPTXTargetCodeGenInfo::addNVVMMetadata (
293+ llvm::GlobalValue *GV, StringRef Name, int Operand,
294+ const SmallVectorImpl<int > &GridConstantArgs) {
281295 llvm::Module *M = GV->getParent ();
282296 llvm::LLVMContext &Ctx = M->getContext ();
283297
284298 // Get "nvvm.annotations" metadata node
285299 llvm::NamedMDNode *MD = M->getOrInsertNamedMetadata (" nvvm.annotations" );
286300
287- llvm::Metadata *MDVals[] = {
301+ SmallVector< llvm::Metadata *, 5 > MDVals = {
288302 llvm::ConstantAsMetadata::get (GV), llvm::MDString::get (Ctx, Name),
289303 llvm::ConstantAsMetadata::get (
290304 llvm::ConstantInt::get (llvm::Type::getInt32Ty (Ctx), Operand))};
305+ if (!GridConstantArgs.empty ()) {
306+ SmallVector<llvm::Metadata *, 10 > GCM;
307+ for (int I : GridConstantArgs)
308+ GCM.push_back (llvm::ConstantAsMetadata::get (
309+ llvm::ConstantInt::get (llvm::Type::getInt32Ty (Ctx), I)));
310+ MDVals.append ({llvm::MDString::get (Ctx, " grid_constant" ),
311+ llvm::MDNode::get (Ctx, GCM)});
312+ }
291313 // Append metadata to nvvm.annotations
292314 MD->addOperand (llvm::MDNode::get (Ctx, MDVals));
293315}
@@ -309,7 +331,7 @@ NVPTXTargetCodeGenInfo::getNullPointer(const CodeGen::CodeGenModule &CGM,
309331 return llvm::ConstantExpr::getAddrSpaceCast (
310332 llvm::ConstantPointerNull::get (NPT), PT);
311333}
312- }
334+ } // namespace
313335
314336void CodeGenModule::handleCUDALaunchBoundsAttr (llvm::Function *F,
315337 const CUDALaunchBoundsAttr *Attr,
0 commit comments