[Mlir-commits] [mlir] a977522 - [NVPTX] Canonicalize NVVM attribute strings and refactor property queries (NFC) (#187752)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Mar 23 08:07:15 PDT 2026
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();
}
More information about the Mlir-commits
mailing list