Index: llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.h =================================================================== --- llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.h +++ llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.h @@ -38,6 +38,7 @@ PROPERTY_REQNTID_Y, PROPERTY_REQNTID_Z, PROPERTY_MINNCTAPERSM, + PROPERTY_MAXNREG, PROPERTY_ISTEXTURE, PROPERTY_ISSURFACE, PROPERTY_ISSAMPLER, Index: llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.cpp =================================================================== --- llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.cpp +++ llvm/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.cpp @@ -27,6 +27,8 @@ return "reqntidz"; case PROPERTY_MINNCTAPERSM: return "minctasm"; + case PROPERTY_MAXNREG: + return "maxnreg"; case PROPERTY_ISTEXTURE: return "texture"; case PROPERTY_ISSURFACE: Index: llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp =================================================================== --- llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -555,6 +555,10 @@ unsigned mincta; if (llvm::getMinCTASm(F, mincta)) O << ".minnctapersm " << mincta << "\n"; + + unsigned maxnreg; + if (llvm::getMaxNReg(F, maxnreg)) + O << ".maxnreg " << maxnreg << "\n"; } std::string Index: llvm/lib/Target/NVPTX/NVPTXUtilities.h =================================================================== --- llvm/lib/Target/NVPTX/NVPTXUtilities.h +++ llvm/lib/Target/NVPTX/NVPTXUtilities.h @@ -57,6 +57,7 @@ bool getReqNTIDz(const Function &, unsigned &); bool getMinCTASm(const Function &, unsigned &); +bool getMaxNReg(const Function &, unsigned &); bool isKernelFunction(const Function &); bool getAlign(const Function &, unsigned index, unsigned &); Index: llvm/lib/Target/NVPTX/NVPTXUtilities.cpp =================================================================== --- llvm/lib/Target/NVPTX/NVPTXUtilities.cpp +++ llvm/lib/Target/NVPTX/NVPTXUtilities.cpp @@ -282,6 +282,10 @@ &F, PropertyAnnotationName(PROPERTY_MINNCTAPERSM), x); } +bool getMaxNReg(const Function &F, unsigned &x) { + return findOneNVVMAnnotation(&F, PropertyAnnotationName(PROPERTY_MAXNREG), x); +} + bool isKernelFunction(const Function &F) { unsigned x = 0; bool retval = findOneNVVMAnnotation( Index: llvm/test/CodeGen/NVPTX/annotations.ll =================================================================== --- llvm/test/CodeGen/NVPTX/annotations.ll +++ llvm/test/CodeGen/NVPTX/annotations.ll @@ -29,9 +29,16 @@ ret void } +; CHECK-LABEL: .entry kernel_func_maxnreg +define void @kernel_func_maxnreg() { +; CHECK: .maxnreg 1234 +; CHECK: ret + ret void +} -!nvvm.annotations = !{!1, !2, !3, !4, !5, !6, !7, !8} + +!nvvm.annotations = !{!1, !2, !3, !4, !5, !6, !7, !8, !9, !10} !1 = !{void (float*)* @kernel_func_maxntid, !"kernel", i32 1} !2 = !{void (float*)* @kernel_func_maxntid, !"maxntidx", i32 10, !"maxntidy", i32 20, !"maxntidz", i32 30} @@ -42,5 +49,8 @@ !5 = !{void (float*)* @kernel_func_minctasm, !"kernel", i32 1} !6 = !{void (float*)* @kernel_func_minctasm, !"minctasm", i32 42} -!7 = !{i64 addrspace(1)* @texture, !"texture", i32 1} -!8 = !{i64 addrspace(1)* @surface, !"surface", i32 1} +!7 = !{void ()* @kernel_func_maxnreg, !"kernel", i32 1} +!8 = !{void ()* @kernel_func_maxnreg, !"maxnreg", i32 1234} + +!9 = !{i64 addrspace(1)* @texture, !"texture", i32 1} +!10 = !{i64 addrspace(1)* @surface, !"surface", i32 1}