Author: Alex MacLean Date: 2026-03-23T08:07:09-07:00 New Revision: a9775221ae31d626ceacdb72a49550ba7e566d67
URL: https://github.com/llvm/llvm-project/commit/a9775221ae31d626ceacdb72a49550ba7e566d67 DIFF: https://github.com/llvm/llvm-project/commit/a9775221ae31d626ceacdb72a49550ba7e566d67.diff LOG: [NVPTX] Canonicalize NVVM attribute strings and refactor property queries (NFC) (#187752) Added: llvm/include/llvm/Support/NVVMAttributes.h Modified: clang/lib/CodeGen/Targets/NVPTX.cpp llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp llvm/lib/IR/AutoUpgrade.cpp llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp llvm/lib/Target/NVPTX/NVVMProperties.cpp llvm/lib/Target/NVPTX/NVVMProperties.h mlir/lib/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/Targets/NVPTX.cpp b/clang/lib/CodeGen/Targets/NVPTX.cpp index 50e116765b892..2e307fc01ccda 100644 --- a/clang/lib/CodeGen/Targets/NVPTX.cpp +++ b/clang/lib/CodeGen/Targets/NVPTX.cpp @@ -13,6 +13,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/IR/CallingConv.h" #include "llvm/IR/IntrinsicsNVPTX.h" +#include "llvm/Support/NVVMAttributes.h" using namespace clang; using namespace clang::CodeGen; @@ -272,9 +273,9 @@ void NVPTXTargetCodeGenInfo::setTargetAttributes( for (auto IV : llvm::enumerate(FD->parameters())) if (IV.value()->hasAttr<CUDAGridConstantAttr>()) - F->addParamAttr( - IV.index(), - llvm::Attribute::get(F->getContext(), "nvvm.grid_constant")); + F->addParamAttr(IV.index(), + llvm::Attribute::get(F->getContext(), + llvm::NVVMAttr::GridConstant)); } if (CUDALaunchBoundsAttr *Attr = FD->getAttr<CUDALaunchBoundsAttr>()) M.handleCUDALaunchBoundsAttr(F, Attr); @@ -358,7 +359,8 @@ void CodeGenModule::handleCUDALaunchBoundsAttr(llvm::Function *F, if (MaxThreadsVal) *MaxThreadsVal = MaxThreads.getExtValue(); if (F) - F->addFnAttr("nvvm.maxntid", llvm::utostr(MaxThreads.getExtValue())); + F->addFnAttr(llvm::NVVMAttr::MaxNTID, + llvm::utostr(MaxThreads.getExtValue())); } // min and max blocks is an optional argument for CUDALaunchBoundsAttr. If it @@ -371,7 +373,8 @@ void CodeGenModule::handleCUDALaunchBoundsAttr(llvm::Function *F, if (MinBlocksVal) *MinBlocksVal = MinBlocks.getExtValue(); if (F) - F->addFnAttr("nvvm.minctasm", llvm::utostr(MinBlocks.getExtValue())); + F->addFnAttr(llvm::NVVMAttr::MinCTASm, + llvm::utostr(MinBlocks.getExtValue())); } } if (Attr->getMaxBlocks()) { @@ -381,7 +384,7 @@ void CodeGenModule::handleCUDALaunchBoundsAttr(llvm::Function *F, if (MaxClusterRankVal) *MaxClusterRankVal = MaxBlocks.getExtValue(); if (F) - F->addFnAttr("nvvm.maxclusterrank", + F->addFnAttr(llvm::NVVMAttr::MaxClusterRank, llvm::utostr(MaxBlocks.getExtValue())); } } diff --git a/llvm/include/llvm/Support/NVVMAttributes.h b/llvm/include/llvm/Support/NVVMAttributes.h new file mode 100644 index 0000000000000..cff3f8514bbfb --- /dev/null +++ b/llvm/include/llvm/Support/NVVMAttributes.h @@ -0,0 +1,33 @@ +//===--- NVVMAttributes.h - NVVM IR attribute names -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Canonical string constants for NVVM function and parameter attributes. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_NVVMATTRIBUTES_H +#define LLVM_SUPPORT_NVVMATTRIBUTES_H + +#include "llvm/ADT/StringRef.h" + +namespace llvm { +namespace NVVMAttr { + +constexpr StringLiteral MaxNTID("nvvm.maxntid"); +constexpr StringLiteral ReqNTID("nvvm.reqntid"); +constexpr StringLiteral ClusterDim("nvvm.cluster_dim"); +constexpr StringLiteral MaxClusterRank("nvvm.maxclusterrank"); +constexpr StringLiteral MinCTASm("nvvm.minctasm"); +constexpr StringLiteral MaxNReg("nvvm.maxnreg"); +constexpr StringLiteral BlocksAreClusters("nvvm.blocksareclusters"); +constexpr StringLiteral GridConstant("nvvm.grid_constant"); + +} // namespace NVVMAttr +} // namespace llvm + +#endif // LLVM_SUPPORT_NVVMATTRIBUTES_H diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index 23e68c63830f5..d149593795267 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -53,6 +53,7 @@ #include "llvm/Support/Error.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/NVVMAttributes.h" #include "llvm/Support/VirtualFileSystem.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" @@ -7945,8 +7946,8 @@ OpenMPIRBuilder::readThreadBoundsForKernel(const Triple &T, Function &Kernel) { return {LB, UB}; } - if (Kernel.hasFnAttribute("nvvm.maxntid")) { - int32_t UB = Kernel.getFnAttributeAsParsedInteger("nvvm.maxntid"); + if (Kernel.hasFnAttribute(NVVMAttr::MaxNTID)) { + int32_t UB = Kernel.getFnAttributeAsParsedInteger(NVVMAttr::MaxNTID); return {0, ThreadLimit ? std::min(ThreadLimit, UB) : UB}; } return {0, ThreadLimit}; @@ -7963,7 +7964,7 @@ void OpenMPIRBuilder::writeThreadBoundsForKernel(const Triple &T, return; } - updateNVPTXAttr(Kernel, "nvvm.maxntid", UB, true); + updateNVPTXAttr(Kernel, NVVMAttr::MaxNTID, UB, true); } std::pair<int32_t, int32_t> @@ -7976,7 +7977,7 @@ void OpenMPIRBuilder::writeTeamsForKernel(const Triple &T, Function &Kernel, int32_t LB, int32_t UB) { if (T.isNVPTX()) if (UB > 0) - Kernel.addFnAttr("nvvm.maxclusterrank", llvm::utostr(UB)); + Kernel.addFnAttr(NVVMAttr::MaxClusterRank, llvm::utostr(UB)); if (T.isAMDGPU()) Kernel.addFnAttr("amdgpu-max-num-workgroups", llvm::utostr(LB) + ",1,1"); diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 3ec3910b5ba02..c267195c89951 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -48,6 +48,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/NVPTXAddrSpace.h" +#include "llvm/Support/NVVMAttributes.h" #include "llvm/Support/Regex.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/TargetParser/Triple.h" @@ -5875,33 +5876,33 @@ bool static upgradeSingleNVVMAnnotation(GlobalValue *GV, StringRef K, } if (K == "maxclusterrank" || K == "cluster_max_blocks") { const auto CV = mdconst::extract<ConstantInt>(V)->getZExtValue(); - cast<Function>(GV)->addFnAttr("nvvm.maxclusterrank", llvm::utostr(CV)); + cast<Function>(GV)->addFnAttr(NVVMAttr::MaxClusterRank, llvm::utostr(CV)); return true; } if (K == "minctasm") { const auto CV = mdconst::extract<ConstantInt>(V)->getZExtValue(); - cast<Function>(GV)->addFnAttr("nvvm.minctasm", llvm::utostr(CV)); + cast<Function>(GV)->addFnAttr(NVVMAttr::MinCTASm, llvm::utostr(CV)); return true; } if (K == "maxnreg") { const auto CV = mdconst::extract<ConstantInt>(V)->getZExtValue(); - cast<Function>(GV)->addFnAttr("nvvm.maxnreg", llvm::utostr(CV)); + cast<Function>(GV)->addFnAttr(NVVMAttr::MaxNReg, llvm::utostr(CV)); return true; } if (K.consume_front("maxntid") && isXYZ(K)) { - upgradeNVVMFnVectorAttr("nvvm.maxntid", K[0], GV, V); + upgradeNVVMFnVectorAttr(NVVMAttr::MaxNTID, K[0], GV, V); return true; } if (K.consume_front("reqntid") && isXYZ(K)) { - upgradeNVVMFnVectorAttr("nvvm.reqntid", K[0], GV, V); + upgradeNVVMFnVectorAttr(NVVMAttr::ReqNTID, K[0], GV, V); return true; } if (K.consume_front("cluster_dim_") && isXYZ(K)) { - upgradeNVVMFnVectorAttr("nvvm.cluster_dim", K[0], GV, V); + upgradeNVVMFnVectorAttr(NVVMAttr::ClusterDim, K[0], GV, V); return true; } if (K == "grid_constant") { - const auto Attr = Attribute::get(GV->getContext(), "nvvm.grid_constant"); + const auto Attr = Attribute::get(GV->getContext(), NVVMAttr::GridConstant); for (const auto &Op : cast<MDNode>(V)->operands()) { // For some reason, the index is 1-based in the metadata. Good thing we're // able to auto-upgrade it! diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp index 80edc6e7b8bcf..9e7a58498040e 100644 --- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -887,12 +887,14 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar, O << ".weak "; } - if (isTexture(*GVar)) { + const PTXOpaqueType OpaqueType = getPTXOpaqueType(*GVar); + + if (OpaqueType == PTXOpaqueType::Texture) { O << ".global .texref " << getTextureName(*GVar) << ";\n"; return; } - if (isSurface(*GVar)) { + if (OpaqueType == PTXOpaqueType::Surface) { O << ".global .surfref " << getSurfaceName(*GVar) << ";\n"; return; } @@ -906,7 +908,7 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar, return; } - if (isSampler(*GVar)) { + if (OpaqueType == PTXOpaqueType::Sampler) { O << ".global .samplerref " << getSamplerName(*GVar); const Constant *Initializer = nullptr; @@ -1355,22 +1357,26 @@ void NVPTXAsmPrinter::emitFunctionParamList(const Function *F, raw_ostream &O) { // Handle image/sampler parameters if (IsKernelFunc) { - const bool IsSampler = isSampler(Arg); - const bool IsTexture = !IsSampler && isImageReadOnly(Arg); - const bool IsSurface = !IsSampler && !IsTexture && - (isImageReadWrite(Arg) || isImageWriteOnly(Arg)); - if (IsSampler || IsTexture || IsSurface) { + const PTXOpaqueType ArgOpaqueType = getPTXOpaqueType(Arg); + if (ArgOpaqueType != PTXOpaqueType::None) { const bool EmitImgPtr = !MFI || !MFI->checkImageHandleSymbol(ParamSym); O << "\t.param "; if (EmitImgPtr) O << ".u64 .ptr "; - if (IsSampler) + switch (ArgOpaqueType) { + case PTXOpaqueType::Sampler: O << ".samplerref "; - else if (IsTexture) + break; + case PTXOpaqueType::Texture: O << ".texref "; - else // IsSurface + break; + case PTXOpaqueType::Surface: O << ".surfref "; + break; + case PTXOpaqueType::None: + llvm_unreachable("handled above"); + } O << ParamSym; continue; } diff --git a/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp index 29ec718ea381c..fe9997e3df2b3 100644 --- a/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXCtorDtorLowering.cpp @@ -24,6 +24,7 @@ #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/MD5.h" +#include "llvm/Support/NVVMAttributes.h" #include "llvm/Transforms/Utils/ModuleUtils.h" using namespace llvm; @@ -51,8 +52,8 @@ static std::string getHash(StringRef Str) { } static void addKernelAttrs(Function *F) { - F->addFnAttr("nvvm.maxclusterrank", "1"); - F->addFnAttr("nvvm.maxntid", "1"); + F->addFnAttr(NVVMAttr::MaxClusterRank, "1"); + F->addFnAttr(NVVMAttr::MaxNTID, "1"); F->setCallingConv(CallingConv::PTX_Kernel); } diff --git a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp index 3d46019a272ce..5018f65e774ae 100644 --- a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp @@ -57,7 +57,7 @@ bool GenericToNVVM::runOnModule(Module &M) { for (GlobalVariable &GV : llvm::make_early_inc_range(M.globals())) { if (GV.getType()->getAddressSpace() == llvm::ADDRESS_SPACE_GENERIC && - !llvm::isTexture(GV) && !llvm::isSurface(GV) && !llvm::isSampler(GV) && + llvm::getPTXOpaqueType(GV) == llvm::PTXOpaqueType::None && !GV.getName().starts_with("llvm.")) { GlobalVariable *NewGV = new GlobalVariable( M, GV.getValueType(), GV.isConstant(), GV.getLinkage(), diff --git a/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp b/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp index 93653da544060..12648a91a7bee 100644 --- a/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXImageOptimizer.cpp @@ -38,9 +38,7 @@ class NVPTXImageOptimizer : public FunctionPass { StringRef getPassName() const override { return "NVPTX Image Optimizer"; } private: - bool replaceIsTypePSampler(Instruction &I); - bool replaceIsTypePSurface(Instruction &I); - bool replaceIsTypePTexture(Instruction &I); + bool replaceIsTypeP(Instruction &I, PTXOpaqueType Expected); Value *cleanupValue(Value *V); void replaceWith(Instruction *From, ConstantInt *To); }; @@ -68,13 +66,13 @@ bool NVPTXImageOptimizer::runOnFunction(Function &F) { switch (CalledF->getIntrinsicID()) { default: break; case Intrinsic::nvvm_istypep_sampler: - Changed |= replaceIsTypePSampler(Instr); + Changed |= replaceIsTypeP(Instr, PTXOpaqueType::Sampler); break; case Intrinsic::nvvm_istypep_surface: - Changed |= replaceIsTypePSurface(Instr); + Changed |= replaceIsTypeP(Instr, PTXOpaqueType::Surface); break; case Intrinsic::nvvm_istypep_texture: - Changed |= replaceIsTypePTexture(Instr); + Changed |= replaceIsTypeP(Instr, PTXOpaqueType::Texture); break; } } @@ -89,58 +87,13 @@ bool NVPTXImageOptimizer::runOnFunction(Function &F) { return Changed; } -bool NVPTXImageOptimizer::replaceIsTypePSampler(Instruction &I) { - Value *TexHandle = cleanupValue(I.getOperand(0)); - if (isSampler(*TexHandle)) { - // This is an OpenCL sampler, so it must be a samplerref - replaceWith(&I, ConstantInt::getTrue(I.getContext())); - return true; - } else if (isImage(*TexHandle)) { - // This is an OpenCL image, so it cannot be a samplerref - replaceWith(&I, ConstantInt::getFalse(I.getContext())); - return true; - } else { - // The image type is unknown, so we cannot eliminate the intrinsic +bool NVPTXImageOptimizer::replaceIsTypeP(Instruction &I, + PTXOpaqueType Expected) { + PTXOpaqueType OT = getPTXOpaqueType(*cleanupValue(I.getOperand(0))); + if (OT == PTXOpaqueType::None) return false; - } -} - -bool NVPTXImageOptimizer::replaceIsTypePSurface(Instruction &I) { - Value *TexHandle = cleanupValue(I.getOperand(0)); - if (isImageReadWrite(*TexHandle) || - isImageWriteOnly(*TexHandle)) { - // This is an OpenCL read-only/read-write image, so it must be a surfref - replaceWith(&I, ConstantInt::getTrue(I.getContext())); - return true; - } else if (isImageReadOnly(*TexHandle) || - isSampler(*TexHandle)) { - // This is an OpenCL read-only/ imageor sampler, so it cannot be - // a surfref - replaceWith(&I, ConstantInt::getFalse(I.getContext())); - return true; - } else { - // The image type is unknown, so we cannot eliminate the intrinsic - return false; - } -} - -bool NVPTXImageOptimizer::replaceIsTypePTexture(Instruction &I) { - Value *TexHandle = cleanupValue(I.getOperand(0)); - if (isImageReadOnly(*TexHandle)) { - // This is an OpenCL read-only image, so it must be a texref - replaceWith(&I, ConstantInt::getTrue(I.getContext())); - return true; - } else if (isImageWriteOnly(*TexHandle) || - isImageReadWrite(*TexHandle) || - isSampler(*TexHandle)) { - // This is an OpenCL read-write/write-only image or a sampler, so it - // cannot be a texref - replaceWith(&I, ConstantInt::getFalse(I.getContext())); - return true; - } else { - // The image type is unknown, so we cannot eliminate the intrinsic - return false; - } + replaceWith(&I, ConstantInt::getBool(I.getContext(), OT == Expected)); + return true; } void NVPTXImageOptimizer::replaceWith(Instruction *From, ConstantInt *To) { diff --git a/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp b/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp index d10a0b90209c3..aaa2902891660 100644 --- a/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXLowerArgs.cpp @@ -155,6 +155,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/NVPTXAddrSpace.h" +#include "llvm/Support/NVVMAttributes.h" #include <queue> #define DEBUG_TYPE "nvptx-lower-args" @@ -375,7 +376,7 @@ static CallInst *createNVVMInternalAddrspaceWrap(IRBuilder<> &IRB, ArgInParam->addRetAttr( Attribute::getWithAlignment(ArgInParam->getContext(), *ParamAlign)); - Arg.addAttr(Attribute::get(Arg.getContext(), "nvvm.grid_constant")); + Arg.addAttr(Attribute::get(Arg.getContext(), NVVMAttr::GridConstant)); Arg.addAttr(Attribute::ReadOnly); return ArgInParam; diff --git a/llvm/lib/Target/NVPTX/NVVMProperties.cpp b/llvm/lib/Target/NVPTX/NVVMProperties.cpp index bbcd8077db2ba..d68c5aaf4fe5f 100644 --- a/llvm/lib/Target/NVPTX/NVVMProperties.cpp +++ b/llvm/lib/Target/NVPTX/NVVMProperties.cpp @@ -18,11 +18,13 @@ #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/IR/GlobalValue.h" +#include "llvm/IR/GlobalVariable.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" #include "llvm/Support/ModRef.h" #include "llvm/Support/Mutex.h" +#include "llvm/Support/NVVMAttributes.h" #include <functional> #include <map> #include <mutex> @@ -47,6 +49,18 @@ AnnotationCache &getAnnotationCache() { } } // namespace +// TODO: Replace these legacy nvvm.annotations metadata names with proper +// function/parameter attributes (like the NVVMAttr:: constants). +namespace NVVMMetadata { +constexpr StringLiteral Texture("texture"); +constexpr StringLiteral Surface("surface"); +constexpr StringLiteral Sampler("sampler"); +constexpr StringLiteral ReadOnlyImage("rdoimage"); +constexpr StringLiteral WriteOnlyImage("wroimage"); +constexpr StringLiteral ReadWriteImage("rdwrimage"); +constexpr StringLiteral Managed("managed"); +} // namespace NVVMMetadata + void clearAnnotationCache(const Module *Mod) { auto &AC = getAnnotationCache(); std::lock_guard<sys::Mutex> Guard(AC.Lock); @@ -102,7 +116,7 @@ static void cacheAnnotationFromMD(const Module *M, const GlobalValue *GV) { } static std::optional<unsigned> findOneNVVMAnnotation(const GlobalValue *GV, - const std::string &Prop) { + StringRef Prop) { auto &AC = getAnnotationCache(); std::lock_guard<sys::Mutex> Guard(AC.Lock); const Module *M = GV->getParent(); @@ -113,14 +127,13 @@ static std::optional<unsigned> findOneNVVMAnnotation(const GlobalValue *GV, cacheAnnotationFromMD(M, GV); auto &KVP = AC.Cache[M][GV]; - auto It = KVP.find(Prop); + auto It = KVP.find(Prop.str()); if (It == KVP.end()) return std::nullopt; return It->second[0]; } -static bool findAllNVVMAnnotation(const GlobalValue *GV, - const std::string &Prop, +static bool findAllNVVMAnnotation(const GlobalValue *GV, StringRef Prop, std::vector<unsigned> &RetVal) { auto &AC = getAnnotationCache(); std::lock_guard<sys::Mutex> Guard(AC.Lock); @@ -132,14 +145,14 @@ static bool findAllNVVMAnnotation(const GlobalValue *GV, cacheAnnotationFromMD(M, GV); auto &KVP = AC.Cache[M][GV]; - auto It = KVP.find(Prop); + auto It = KVP.find(Prop.str()); if (It == KVP.end()) return false; RetVal = It->second; return true; } -static bool globalHasNVVMAnnotation(const Value &V, const std::string &Prop) { +static bool globalHasNVVMAnnotation(const Value &V, StringRef Prop) { if (const auto *GV = dyn_cast<GlobalValue>(&V)) if (const auto Annot = findOneNVVMAnnotation(GV, Prop)) { assert((*Annot == 1) && "Unexpected annotation on a symbol"); @@ -149,8 +162,7 @@ static bool globalHasNVVMAnnotation(const Value &V, const std::string &Prop) { return false; } -static bool argHasNVVMAnnotation(const Value &Val, - const std::string &Annotation) { +static bool argHasNVVMAnnotation(const Value &Val, StringRef Annotation) { if (const auto *Arg = dyn_cast<Argument>(&Val)) { std::vector<unsigned> Annot; if (findAllNVVMAnnotation(Arg->getParent(), Annotation, Annot) && @@ -197,44 +209,49 @@ static std::optional<uint64_t> getVectorProduct(ArrayRef<unsigned> V) { std::multiplies<uint64_t>{}); } -bool isTexture(const Value &V) { return globalHasNVVMAnnotation(V, "texture"); } - -bool isSurface(const Value &V) { return globalHasNVVMAnnotation(V, "surface"); } - -bool isSampler(const Value &V) { - const char *AnnotationName = "sampler"; - return globalHasNVVMAnnotation(V, AnnotationName) || - argHasNVVMAnnotation(V, AnnotationName); -} - -bool isImageReadOnly(const Value &V) { - return argHasNVVMAnnotation(V, "rdoimage"); +PTXOpaqueType getPTXOpaqueType(const GlobalVariable &GV) { + if (findOneNVVMAnnotation(&GV, NVVMMetadata::Texture)) + return PTXOpaqueType::Texture; + if (findOneNVVMAnnotation(&GV, NVVMMetadata::Surface)) + return PTXOpaqueType::Surface; + if (findOneNVVMAnnotation(&GV, NVVMMetadata::Sampler)) + return PTXOpaqueType::Sampler; + return PTXOpaqueType::None; } -bool isImageWriteOnly(const Value &V) { - return argHasNVVMAnnotation(V, "wroimage"); +PTXOpaqueType getPTXOpaqueType(const Argument &Arg) { + if (argHasNVVMAnnotation(Arg, NVVMMetadata::Sampler)) + return PTXOpaqueType::Sampler; + if (argHasNVVMAnnotation(Arg, NVVMMetadata::ReadOnlyImage)) + return PTXOpaqueType::Texture; + if (argHasNVVMAnnotation(Arg, NVVMMetadata::WriteOnlyImage) || + argHasNVVMAnnotation(Arg, NVVMMetadata::ReadWriteImage)) + return PTXOpaqueType::Surface; + return PTXOpaqueType::None; } -bool isImageReadWrite(const Value &V) { - return argHasNVVMAnnotation(V, "rdwrimage"); +PTXOpaqueType getPTXOpaqueType(const Value &V) { + if (const auto *GV = dyn_cast<GlobalVariable>(&V)) + return getPTXOpaqueType(*GV); + if (const auto *Arg = dyn_cast<Argument>(&V)) + return getPTXOpaqueType(*Arg); + return PTXOpaqueType::None; } -bool isImage(const Value &V) { - return isImageReadOnly(V) || isImageWriteOnly(V) || isImageReadWrite(V); +bool isManaged(const Value &V) { + return globalHasNVVMAnnotation(V, NVVMMetadata::Managed); } -bool isManaged(const Value &V) { return globalHasNVVMAnnotation(V, "managed"); } - SmallVector<unsigned, 3> getMaxNTID(const Function &F) { - return getFnAttrParsedVector(F, "nvvm.maxntid"); + return getFnAttrParsedVector(F, NVVMAttr::MaxNTID); } SmallVector<unsigned, 3> getReqNTID(const Function &F) { - return getFnAttrParsedVector(F, "nvvm.reqntid"); + return getFnAttrParsedVector(F, NVVMAttr::ReqNTID); } SmallVector<unsigned, 3> getClusterDim(const Function &F) { - return getFnAttrParsedVector(F, "nvvm.cluster_dim"); + return getFnAttrParsedVector(F, NVVMAttr::ClusterDim); } std::optional<uint64_t> getOverallMaxNTID(const Function &F) { @@ -262,19 +279,19 @@ std::optional<uint64_t> getOverallClusterRank(const Function &F) { } std::optional<unsigned> getMaxClusterRank(const Function &F) { - return getFnAttrParsedInt(F, "nvvm.maxclusterrank"); + return getFnAttrParsedInt(F, NVVMAttr::MaxClusterRank); } std::optional<unsigned> getMinCTASm(const Function &F) { - return getFnAttrParsedInt(F, "nvvm.minctasm"); + return getFnAttrParsedInt(F, NVVMAttr::MinCTASm); } std::optional<unsigned> getMaxNReg(const Function &F) { - return getFnAttrParsedInt(F, "nvvm.maxnreg"); + return getFnAttrParsedInt(F, NVVMAttr::MaxNReg); } bool hasBlocksAreClusters(const Function &F) { - return F.hasFnAttribute("nvvm.blocksareclusters"); + return F.hasFnAttribute(NVVMAttr::BlocksAreClusters); } bool isParamGridConstant(const Argument &Arg) { @@ -297,7 +314,7 @@ bool isParamGridConstant(const Argument &Arg) { } // "grid_constant" counts argument indices starting from 1 - return Arg.hasAttribute("nvvm.grid_constant"); + return Arg.hasAttribute(NVVMAttr::GridConstant); } MaybeAlign getAlign(const CallInst &I, unsigned Index) { diff --git a/llvm/lib/Target/NVPTX/NVVMProperties.h b/llvm/lib/Target/NVPTX/NVVMProperties.h index 479ccbf28dd2e..6ccd6f8a20075 100644 --- a/llvm/lib/Target/NVPTX/NVVMProperties.h +++ b/llvm/lib/Target/NVPTX/NVVMProperties.h @@ -25,6 +25,7 @@ namespace llvm { class Argument; class CallInst; +class GlobalVariable; class Module; class Value; @@ -34,13 +35,12 @@ inline bool isKernelFunction(const Function &F) { return F.getCallingConv() == CallingConv::PTX_Kernel; } -bool isTexture(const Value &); -bool isSurface(const Value &); -bool isSampler(const Value &); -bool isImage(const Value &); -bool isImageReadOnly(const Value &); -bool isImageWriteOnly(const Value &); -bool isImageReadWrite(const Value &); +enum class PTXOpaqueType { None, Texture, Surface, Sampler }; + +PTXOpaqueType getPTXOpaqueType(const GlobalVariable &); +PTXOpaqueType getPTXOpaqueType(const Argument &); +PTXOpaqueType getPTXOpaqueType(const Value &); + bool isManaged(const Value &); SmallVector<unsigned, 3> getMaxNTID(const Function &); diff --git a/mlir/lib/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.cpp index 5e5f6700c9fd7..18d42e9577095 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.cpp @@ -21,6 +21,7 @@ #include "llvm/IR/IRBuilder.h" #include "llvm/IR/IntrinsicsNVPTX.h" #include "llvm/Support/FormatVariadic.h" +#include "llvm/Support/NVVMAttributes.h" using namespace mlir; using namespace mlir::LLVM; @@ -714,7 +715,7 @@ class NVVMDialectLLVMIRTranslationInterface const std::string attr = llvm::formatv( "{0:$[,]}", llvm::make_range(values.asArrayRef().begin(), values.asArrayRef().end())); - llvmFunc->addFnAttr("nvvm.maxntid", attr); + llvmFunc->addFnAttr(llvm::NVVMAttr::MaxNTID, attr); } else if (attribute.getName() == NVVM::NVVMDialect::getReqntidAttrName()) { if (!isa<DenseI32ArrayAttr>(attribute.getValue())) return failure(); @@ -722,7 +723,7 @@ class NVVMDialectLLVMIRTranslationInterface const std::string attr = llvm::formatv( "{0:$[,]}", llvm::make_range(values.asArrayRef().begin(), values.asArrayRef().end())); - llvmFunc->addFnAttr("nvvm.reqntid", attr); + llvmFunc->addFnAttr(llvm::NVVMAttr::ReqNTID, attr); } else if (attribute.getName() == NVVM::NVVMDialect::getClusterDimAttrName()) { if (!isa<DenseI32ArrayAttr>(attribute.getValue())) @@ -731,24 +732,27 @@ class NVVMDialectLLVMIRTranslationInterface const std::string attr = llvm::formatv( "{0:$[,]}", llvm::make_range(values.asArrayRef().begin(), values.asArrayRef().end())); - llvmFunc->addFnAttr("nvvm.cluster_dim", attr); + llvmFunc->addFnAttr(llvm::NVVMAttr::ClusterDim, attr); } else if (attribute.getName() == NVVM::NVVMDialect::getClusterMaxBlocksAttrName()) { auto value = dyn_cast<IntegerAttr>(attribute.getValue()); - llvmFunc->addFnAttr("nvvm.maxclusterrank", llvm::utostr(value.getInt())); + llvmFunc->addFnAttr(llvm::NVVMAttr::MaxClusterRank, + llvm::utostr(value.getInt())); } else if (attribute.getName() == NVVM::NVVMDialect::getMinctasmAttrName()) { auto value = dyn_cast<IntegerAttr>(attribute.getValue()); - llvmFunc->addFnAttr("nvvm.minctasm", llvm::utostr(value.getInt())); + llvmFunc->addFnAttr(llvm::NVVMAttr::MinCTASm, + llvm::utostr(value.getInt())); } else if (attribute.getName() == NVVM::NVVMDialect::getMaxnregAttrName()) { auto value = dyn_cast<IntegerAttr>(attribute.getValue()); - llvmFunc->addFnAttr("nvvm.maxnreg", llvm::utostr(value.getInt())); + llvmFunc->addFnAttr(llvm::NVVMAttr::MaxNReg, + llvm::utostr(value.getInt())); } else if (attribute.getName() == NVVM::NVVMDialect::getKernelFuncAttrName()) { llvmFunc->setCallingConv(llvm::CallingConv::PTX_Kernel); } else if (attribute.getName() == NVVM::NVVMDialect::getBlocksAreClustersAttrName()) { - llvmFunc->addFnAttr("nvvm.blocksareclusters"); + llvmFunc->addFnAttr(llvm::NVVMAttr::BlocksAreClusters); } return success(); @@ -764,7 +768,8 @@ class NVVMDialectLLVMIRTranslationInterface if (attribute.getName() == NVVM::NVVMDialect::getGridConstantAttrName()) { llvmFunc->addParamAttr( - argIdx, llvm::Attribute::get(llvmContext, "nvvm.grid_constant")); + argIdx, + llvm::Attribute::get(llvmContext, llvm::NVVMAttr::GridConstant)); } return success(); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
