[Mlir-commits] [mlir] 220dd61 - [mlir][NVVM] Split enums and attributes out of NVVMDialect.h (#235655)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Oct 26 03:12:15 PDT 2026


Author: Markus Böck
Date: 2026-10-26T10:12:10Z
New Revision: 220dd616279c15d28488e6a3cf74e4b040b27312

URL: https://github.com/llvm/llvm-project/commit/220dd616279c15d28488e6a3cf74e4b040b27312
DIFF: https://github.com/llvm/llvm-project/commit/220dd616279c15d28488e6a3cf74e4b040b27312.diff

LOG: [mlir][NVVM] Split enums and attributes out of NVVMDialect.h (#235655)

Many users of the NVVM dialect outside of the dialect itself only need
its enums and attributes but had to include `NVVMDialect.h`, which pulls
in the declarations of all NVVM ops and their includes.

Add a new `NVVMAttributes.h` header that declares only the NVVM enums
and attributes, and use it instead of `NVVMDialect.h` where applicable.
`NVVMDialect.h` should now only be included when op declarations are
required. Includes not-specific to `NVVMDialect.h` have been moved to
`NVVMAttributes.h` (but are still pulled in through the
`NVVMAttributes.h` include)

The definitions were split out of NVVMDialect.cpp as well to keep a
traditional header-source file split.

---------

Co-authored-by: Claude <noreply at anthropic.com>

Added: 
    mlir/include/mlir/Dialect/LLVMIR/NVVMAttributes.h
    mlir/lib/Dialect/LLVMIR/IR/NVVMAttributes.cpp

Modified: 
    mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.h
    mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.td
    mlir/include/mlir/Dialect/NVGPU/IR/NVGPUDialect.h
    mlir/include/mlir/Dialect/NVGPU/Utils/MMAUtils.h
    mlir/include/mlir/Target/LLVM/NVVM/Utils.h
    mlir/lib/Dialect/GPU/Transforms/NVVM/NVVMAttachTarget.cpp
    mlir/lib/Dialect/LLVMIR/CMakeLists.txt
    mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
    mlir/lib/Target/LLVM/NVVM/Target.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMAttributes.h b/mlir/include/mlir/Dialect/LLVMIR/NVVMAttributes.h
new file mode 100644
index 00000000000000..a2160d0773e254
--- /dev/null
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMAttributes.h
@@ -0,0 +1,46 @@
+//===- NVVMAttributes.h - NVVM enums and attributes -------------*- 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares the NVVM dialect enums and attributes.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_DIALECT_LLVMIR_NVVMATTRIBUTES_H_
+#define MLIR_DIALECT_LLVMIR_NVVMATTRIBUTES_H_
+
+#include "mlir/Dialect/GPU/IR/CompilationInterfaces.h"
+#include "mlir/Dialect/LLVMIR/LLVMInterfaces.h"
+#include "mlir/Dialect/LLVMIR/NVVMDialectDecl.h"
+#include "mlir/Dialect/Ptr/IR/MemorySpaceInterfaces.h"
+#include "mlir/IR/Attributes.h"
+#include "mlir/IR/BuiltinAttributes.h"
+
+#include "mlir/Dialect/LLVMIR/NVVMOpsEnums.h.inc"
+
+namespace mlir {
+namespace NVVM {
+/// Utility functions to compare NVVMMemorySpace with unsigned values.
+inline bool operator==(unsigned as, NVVMMemorySpace memSpace) {
+  return as == static_cast<unsigned>(memSpace);
+}
+inline bool operator==(NVVMMemorySpace memSpace, unsigned as) {
+  return static_cast<unsigned>(memSpace) == as;
+}
+inline bool operator!=(unsigned as, NVVMMemorySpace memSpace) {
+  return as != static_cast<unsigned>(memSpace);
+}
+inline bool operator!=(NVVMMemorySpace memSpace, unsigned as) {
+  return static_cast<unsigned>(memSpace) != as;
+}
+} // namespace NVVM
+} // namespace mlir
+
+#define GET_ATTRDEF_CLASSES
+#include "mlir/Dialect/LLVMIR/NVVMOpsAttributes.h.inc"
+
+#endif // MLIR_DIALECT_LLVMIR_NVVMATTRIBUTES_H_

diff  --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.h b/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.h
index 31df487dac9678..2b442b2e5aafbd 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.h
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.h
@@ -15,36 +15,17 @@
 #define MLIR_DIALECT_LLVMIR_NVVMDIALECT_H_
 
 #include "mlir/Bytecode/BytecodeOpInterface.h"
-#include "mlir/Dialect/GPU/IR/GPUDialect.h"
 #include "mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.h"
 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
-#include "mlir/Dialect/LLVMIR/NVVMDialectDecl.h"
+#include "mlir/Dialect/LLVMIR/NVVMAttributes.h"
 #include "mlir/Dialect/LLVMIR/NVVMRequiresSMTraits.h"
-#include "mlir/Dialect/Ptr/IR/MemorySpaceInterfaces.h"
-#include "mlir/IR/Dialect.h"
 #include "mlir/IR/OpDefinition.h"
 #include "mlir/Interfaces/InferIntRangeInterface.h"
 #include "mlir/Interfaces/SideEffectInterfaces.h"
 #include "llvm/IR/IntrinsicsNVPTX.h"
 
-#include "mlir/Dialect/LLVMIR/NVVMOpsEnums.h.inc"
-
 namespace mlir {
 namespace NVVM {
-/// Utility functions to compare NVVMMemorySpace with unsigned values.
-inline bool operator==(unsigned as, NVVMMemorySpace memSpace) {
-  return as == static_cast<unsigned>(memSpace);
-}
-inline bool operator==(NVVMMemorySpace memSpace, unsigned as) {
-  return static_cast<unsigned>(memSpace) == as;
-}
-inline bool operator!=(unsigned as, NVVMMemorySpace memSpace) {
-  return as != static_cast<unsigned>(memSpace);
-}
-inline bool operator!=(NVVMMemorySpace memSpace, unsigned as) {
-  return static_cast<unsigned>(memSpace) != as;
-}
-
 // Shared memory has 128-bit alignment
 constexpr int kSharedMemoryAlignmentBit = 128;
 
@@ -66,10 +47,6 @@ class ModuleTranslation;
 } // namespace LLVM
 } // namespace mlir
 
-///// Ops /////
-#define GET_ATTRDEF_CLASSES
-#include "mlir/Dialect/LLVMIR/NVVMOpsAttributes.h.inc"
-
 #define GET_OP_CLASSES
 #include "mlir/Dialect/LLVMIR/NVVMOps.h.inc"
 

diff  --git a/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.td b/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.td
index 025e093ebd8b61..48480bc2daacb7 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/NVVMDialect.td
@@ -86,6 +86,10 @@ def NVVM_Dialect : Dialect {
                                            unsigned regionIndex,
                                            unsigned argIndex,
                                            NamedAttribute argAttr) override;
+
+  private:
+    /// Register the attributes of this dialect.
+    void registerAttributes();
   }];
 
   let useDefaultAttributePrinterParser = 1;

diff  --git a/mlir/include/mlir/Dialect/NVGPU/IR/NVGPUDialect.h b/mlir/include/mlir/Dialect/NVGPU/IR/NVGPUDialect.h
index 7c90c8c5ca03d7..7641442eaaaee4 100644
--- a/mlir/include/mlir/Dialect/NVGPU/IR/NVGPUDialect.h
+++ b/mlir/include/mlir/Dialect/NVGPU/IR/NVGPUDialect.h
@@ -14,7 +14,7 @@
 #define MLIR_DIALECT_NVGPU_NVGPUDIALECT_H_
 
 #include "mlir/Bytecode/BytecodeOpInterface.h"
-#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
+#include "mlir/Dialect/LLVMIR/NVVMAttributes.h"
 #include "mlir/Dialect/NVGPU/IR/NVGPUDialectDecl.h"
 #include "mlir/IR/BuiltinTypes.h"
 #include "mlir/IR/Dialect.h"

diff  --git a/mlir/include/mlir/Dialect/NVGPU/Utils/MMAUtils.h b/mlir/include/mlir/Dialect/NVGPU/Utils/MMAUtils.h
index faeba0e128db45..996f993bed180b 100644
--- a/mlir/include/mlir/Dialect/NVGPU/Utils/MMAUtils.h
+++ b/mlir/include/mlir/Dialect/NVGPU/Utils/MMAUtils.h
@@ -13,7 +13,7 @@
 #ifndef MLIR_DIALECT_NVGPU_UTILS_MMAUTILS_H
 #define MLIR_DIALECT_NVGPU_UTILS_MMAUTILS_H
 
-#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
+#include "mlir/Dialect/LLVMIR/NVVMAttributes.h"
 #include "mlir/Dialect/Vector/IR/VectorOps.h"
 #include "mlir/IR/PatternMatch.h"
 #include "mlir/IR/Types.h"

diff  --git a/mlir/include/mlir/Target/LLVM/NVVM/Utils.h b/mlir/include/mlir/Target/LLVM/NVVM/Utils.h
index ca4b6424a292c4..2eca2fbd84666c 100644
--- a/mlir/include/mlir/Target/LLVM/NVVM/Utils.h
+++ b/mlir/include/mlir/Target/LLVM/NVVM/Utils.h
@@ -14,7 +14,7 @@
 #define MLIR_TARGET_LLVM_NVVM_UTILS_H
 
 #include "mlir/Dialect/GPU/IR/CompilationInterfaces.h"
-#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
+#include "mlir/Dialect/LLVMIR/NVVMAttributes.h"
 #include "mlir/Target/LLVM/ModuleToObject.h"
 
 namespace mlir {

diff  --git a/mlir/lib/Dialect/GPU/Transforms/NVVM/NVVMAttachTarget.cpp b/mlir/lib/Dialect/GPU/Transforms/NVVM/NVVMAttachTarget.cpp
index 05ffff5260358f..60e37d2a395347 100644
--- a/mlir/lib/Dialect/GPU/Transforms/NVVM/NVVMAttachTarget.cpp
+++ b/mlir/lib/Dialect/GPU/Transforms/NVVM/NVVMAttachTarget.cpp
@@ -14,7 +14,7 @@
 #include "mlir/Dialect/GPU/Transforms/NVVM/Passes.h"
 
 #include "mlir/Dialect/GPU/IR/GPUDialect.h"
-#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
+#include "mlir/Dialect/LLVMIR/NVVMAttributes.h"
 #include "mlir/IR/Builders.h"
 #include "mlir/Pass/Pass.h"
 #include "llvm/Support/Regex.h"

diff  --git a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
index b39526e88fcefc..20999d8edb7244 100644
--- a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
+++ b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
@@ -73,6 +73,7 @@ endforeach()
 add_public_tablegen_target(MLIRNVVMOpsShardGen)
 
 add_mlir_dialect_library(MLIRNVVMDialect
+  IR/NVVMAttributes.cpp
   IR/NVVMDialect.cpp
   IR/BasicPtxBuilderInterface.cpp
   IR/NVVMRequiresSMTraits.cpp

diff  --git a/mlir/lib/Dialect/LLVMIR/IR/NVVMAttributes.cpp b/mlir/lib/Dialect/LLVMIR/IR/NVVMAttributes.cpp
new file mode 100644
index 00000000000000..fcc37cef7f7ea0
--- /dev/null
+++ b/mlir/lib/Dialect/LLVMIR/IR/NVVMAttributes.cpp
@@ -0,0 +1,169 @@
+//===- NVVMAttributes.cpp - NVVM enums and attributes ---------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the NVVM dialect enums and attributes.
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Dialect/LLVMIR/NVVMAttributes.h"
+
+#include "mlir/Dialect/GPU/IR/GPUDialect.h"
+#include "mlir/Dialect/LLVMIR/LLVMAttrs.h"
+#include "mlir/Dialect/LLVMIR/NVVMRequiresSMTraits.h"
+#include "mlir/IR/DialectImplementation.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/TypeSwitch.h"
+#include <optional>
+
+using namespace mlir;
+using namespace NVVM;
+
+#include "mlir/Dialect/LLVMIR/NVVMOpsEnums.cpp.inc"
+
+//===----------------------------------------------------------------------===//
+// NVVM Address Space Attr
+//===----------------------------------------------------------------------===//
+
+unsigned NVVMMemorySpaceAttr::getAddressSpace() const {
+  return static_cast<unsigned>(getValue());
+}
+
+bool NVVMMemorySpaceAttr::isValidLoad(
+    Type type, ptr::AtomicOrdering ordering, std::optional<int64_t> alignment,
+    const ::mlir::DataLayout *dataLayout,
+    function_ref<InFlightDiagnostic()> emitError) const {
+  return LLVM::detail::isValidLoadStoreImpl(type, ordering, alignment,
+                                            dataLayout, emitError);
+}
+
+bool NVVMMemorySpaceAttr::isValidStore(
+    Type type, ptr::AtomicOrdering ordering, std::optional<int64_t> alignment,
+    const ::mlir::DataLayout *dataLayout,
+    function_ref<InFlightDiagnostic()> emitError) const {
+  return LLVM::detail::isValidLoadStoreImpl(type, ordering, alignment,
+                                            dataLayout, emitError);
+}
+
+bool NVVMMemorySpaceAttr::isValidAtomicOp(
+    ptr::AtomicBinOp op, Type type, ptr::AtomicOrdering ordering,
+    std::optional<int64_t> alignment, const ::mlir::DataLayout *dataLayout,
+    function_ref<InFlightDiagnostic()> emitError) const {
+  // TODO: update this method once `ptr.atomic_rmw` is implemented.
+  assert(false && "unimplemented, see TODO in the source.");
+  return false;
+}
+
+bool NVVMMemorySpaceAttr::isValidAtomicXchg(
+    Type type, ptr::AtomicOrdering successOrdering,
+    ptr::AtomicOrdering failureOrdering, std::optional<int64_t> alignment,
+    const ::mlir::DataLayout *dataLayout,
+    function_ref<InFlightDiagnostic()> emitError) const {
+  // TODO: update this method once `ptr.atomic_cmpxchg` is implemented.
+  assert(false && "unimplemented, see TODO in the source.");
+  return false;
+}
+
+bool NVVMMemorySpaceAttr::isValidAddrSpaceCast(
+    Type tgt, Type src, function_ref<InFlightDiagnostic()> emitError) const {
+  // TODO: update this method once the `ptr.addrspace_cast` op is added to the
+  // dialect.
+  assert(false && "unimplemented, see TODO in the source.");
+  return false;
+}
+
+bool NVVMMemorySpaceAttr::isValidPtrIntCast(
+    Type intLikeTy, Type ptrLikeTy,
+    function_ref<InFlightDiagnostic()> emitError) const {
+  // TODO: update this method once the int-cast ops are added to the `ptr`
+  // dialect.
+  assert(false && "unimplemented, see TODO in the source.");
+  return false;
+}
+
+//===----------------------------------------------------------------------===//
+// NVVM target attribute.
+//===----------------------------------------------------------------------===//
+LogicalResult
+NVVMTargetAttr::verify(function_ref<InFlightDiagnostic()> emitError,
+                       int optLevel, StringRef triple, StringRef chip,
+                       StringRef features, DictionaryAttr flags,
+                       ArrayAttr files, bool verifyTarget) {
+  if (optLevel < 0 || optLevel > 3) {
+    emitError() << "The optimization level must be a number between 0 and 3.";
+    return failure();
+  }
+  if (triple.empty()) {
+    emitError() << "The target triple cannot be empty.";
+    return failure();
+  }
+  if (chip.empty()) {
+    emitError() << "The target chip cannot be empty.";
+    return failure();
+  }
+  if (files && !llvm::all_of(files, [](::mlir::Attribute attr) {
+        return mlir::isa_and_nonnull<StringAttr>(attr);
+      })) {
+    emitError() << "All the elements in the `link` array must be strings.";
+    return failure();
+  }
+  return success();
+}
+
+LogicalResult NVVMTargetAttr::verifyTarget(Operation *gpuModule) {
+  if (!getVerifyTarget())
+    return success();
+
+  auto gpuModuleOp = llvm::dyn_cast<gpu::GPUModuleOp>(gpuModule);
+  if (!gpuModuleOp) {
+    return emitError(gpuModule->getLoc(),
+                     "NVVM target attribute must be attached to a GPU module");
+  }
+
+  std::optional<unsigned> targetFullSmVersion =
+      NVVMCheckSMVersion::getTargetFullSmVersionFromStr(getChip());
+  if (!targetFullSmVersion)
+    return emitError(gpuModule->getLoc())
+           << "invalid NVVM target chip \"" << getChip()
+           << "\", expected sm_<version>[a|f]";
+
+  if (!NVVMCheckSMVersion::isMinimumSMVersion(*targetFullSmVersion)) {
+    return emitError(gpuModule->getLoc(),
+                     "Minimum NVVM target SM version is sm_20");
+  }
+
+  if (gpuModuleOp
+          ->walk([&](Operation *op) {
+            if (auto reqOp = llvm::dyn_cast<NVVM::RequiresSMInterface>(op)) {
+              const NVVMCheckSMVersion requirement =
+                  reqOp.getRequiredMinSMVersion();
+              if (!requirement.isCompatibleWith(*targetFullSmVersion)) {
+                op->emitOpError() << "is not supported on " << getChip();
+                return WalkResult::interrupt();
+              }
+            }
+            return WalkResult::advance();
+          })
+          .wasInterrupted())
+    return failure();
+
+  return success();
+}
+
+#define GET_ATTRDEF_CLASSES
+#include "mlir/Dialect/LLVMIR/NVVMOpsAttributes.cpp.inc"
+
+//===----------------------------------------------------------------------===//
+// NVVMDialect attribute registration
+//===----------------------------------------------------------------------===//
+
+void NVVMDialect::registerAttributes() {
+  addAttributes<
+#define GET_ATTRDEF_LIST
+#include "mlir/Dialect/LLVMIR/NVVMOpsAttributes.cpp.inc"
+      >();
+}

diff  --git a/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
index d7d0e6f329f138..bd3e18946393b2 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp
@@ -6,8 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file defines the types and operation details for the NVVM IR dialect in
-// MLIR, and the LLVM IR dialect.  It also registers the dialect.
+// This file defines the operations of the NVVM IR dialect in MLIR and
+// registers the dialect.
 //
 // The NVVM dialect only contains GPU specific additions on top of the general
 // LLVM dialect.
@@ -20,7 +20,6 @@
 
 #include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"
 #include "mlir/Dialect/GPU/IR/CompilationInterfaces.h"
-#include "mlir/Dialect/GPU/IR/GPUDialect.h"
 #include "mlir/IR/Builders.h"
 #include "mlir/IR/BuiltinAttributes.h"
 #include "mlir/IR/BuiltinTypes.h"
@@ -52,7 +51,6 @@ using namespace mlir;
 using namespace NVVM;
 
 #include "mlir/Dialect/LLVMIR/NVVMOpsDialect.cpp.inc"
-#include "mlir/Dialect/LLVMIR/NVVMOpsEnums.cpp.inc"
 
 static constexpr unsigned notIntrinsic = llvm::Intrinsic::not_intrinsic;
 
@@ -7176,10 +7174,7 @@ struct NVVMInlinerInterface final : DialectInlinerInterface {
 // TODO: This should be the llvm.nvvm dialect once this is supported.
 void NVVMDialect::initialize() {
   registerNVVMDialectOperations(this);
-  addAttributes<
-#define GET_ATTRDEF_LIST
-#include "mlir/Dialect/LLVMIR/NVVMOpsAttributes.cpp.inc"
-      >();
+  registerAttributes();
 
   // Support unknown operations because not all NVVM operations are
   // registered.
@@ -7263,135 +7258,3 @@ LogicalResult NVVMDialect::verifyRegionArgAttribute(Operation *op,
 
   return success();
 }
-
-//===----------------------------------------------------------------------===//
-// NVVM Address Space Attr
-//===----------------------------------------------------------------------===//
-
-unsigned NVVMMemorySpaceAttr::getAddressSpace() const {
-  return static_cast<unsigned>(getValue());
-}
-
-bool NVVMMemorySpaceAttr::isValidLoad(
-    Type type, ptr::AtomicOrdering ordering, std::optional<int64_t> alignment,
-    const ::mlir::DataLayout *dataLayout,
-    function_ref<InFlightDiagnostic()> emitError) const {
-  return LLVM::detail::isValidLoadStoreImpl(type, ordering, alignment,
-                                            dataLayout, emitError);
-}
-
-bool NVVMMemorySpaceAttr::isValidStore(
-    Type type, ptr::AtomicOrdering ordering, std::optional<int64_t> alignment,
-    const ::mlir::DataLayout *dataLayout,
-    function_ref<InFlightDiagnostic()> emitError) const {
-  return LLVM::detail::isValidLoadStoreImpl(type, ordering, alignment,
-                                            dataLayout, emitError);
-}
-
-bool NVVMMemorySpaceAttr::isValidAtomicOp(
-    ptr::AtomicBinOp op, Type type, ptr::AtomicOrdering ordering,
-    std::optional<int64_t> alignment, const ::mlir::DataLayout *dataLayout,
-    function_ref<InFlightDiagnostic()> emitError) const {
-  // TODO: update this method once `ptr.atomic_rmw` is implemented.
-  assert(false && "unimplemented, see TODO in the source.");
-  return false;
-}
-
-bool NVVMMemorySpaceAttr::isValidAtomicXchg(
-    Type type, ptr::AtomicOrdering successOrdering,
-    ptr::AtomicOrdering failureOrdering, std::optional<int64_t> alignment,
-    const ::mlir::DataLayout *dataLayout,
-    function_ref<InFlightDiagnostic()> emitError) const {
-  // TODO: update this method once `ptr.atomic_cmpxchg` is implemented.
-  assert(false && "unimplemented, see TODO in the source.");
-  return false;
-}
-
-bool NVVMMemorySpaceAttr::isValidAddrSpaceCast(
-    Type tgt, Type src, function_ref<InFlightDiagnostic()> emitError) const {
-  // TODO: update this method once the `ptr.addrspace_cast` op is added to the
-  // dialect.
-  assert(false && "unimplemented, see TODO in the source.");
-  return false;
-}
-
-bool NVVMMemorySpaceAttr::isValidPtrIntCast(
-    Type intLikeTy, Type ptrLikeTy,
-    function_ref<InFlightDiagnostic()> emitError) const {
-  // TODO: update this method once the int-cast ops are added to the `ptr`
-  // dialect.
-  assert(false && "unimplemented, see TODO in the source.");
-  return false;
-}
-
-//===----------------------------------------------------------------------===//
-// NVVM target attribute.
-//===----------------------------------------------------------------------===//
-LogicalResult
-NVVMTargetAttr::verify(function_ref<InFlightDiagnostic()> emitError,
-                       int optLevel, StringRef triple, StringRef chip,
-                       StringRef features, DictionaryAttr flags,
-                       ArrayAttr files, bool verifyTarget) {
-  if (optLevel < 0 || optLevel > 3) {
-    emitError() << "The optimization level must be a number between 0 and 3.";
-    return failure();
-  }
-  if (triple.empty()) {
-    emitError() << "The target triple cannot be empty.";
-    return failure();
-  }
-  if (chip.empty()) {
-    emitError() << "The target chip cannot be empty.";
-    return failure();
-  }
-  if (files && !llvm::all_of(files, [](::mlir::Attribute attr) {
-        return mlir::isa_and_nonnull<StringAttr>(attr);
-      })) {
-    emitError() << "All the elements in the `link` array must be strings.";
-    return failure();
-  }
-  return success();
-}
-
-LogicalResult NVVMTargetAttr::verifyTarget(Operation *gpuModule) {
-  if (!getVerifyTarget())
-    return success();
-
-  auto gpuModuleOp = llvm::dyn_cast<gpu::GPUModuleOp>(gpuModule);
-  if (!gpuModuleOp) {
-    return emitError(gpuModule->getLoc(),
-                     "NVVM target attribute must be attached to a GPU module");
-  }
-
-  std::optional<unsigned> targetFullSmVersion =
-      NVVMCheckSMVersion::getTargetFullSmVersionFromStr(getChip());
-  if (!targetFullSmVersion)
-    return emitError(gpuModule->getLoc())
-           << "invalid NVVM target chip \"" << getChip()
-           << "\", expected sm_<version>[a|f]";
-
-  if (!NVVMCheckSMVersion::isMinimumSMVersion(*targetFullSmVersion)) {
-    return emitError(gpuModule->getLoc(),
-                     "Minimum NVVM target SM version is sm_20");
-  }
-
-  if (gpuModuleOp
-          ->walk([&](Operation *op) {
-            if (auto reqOp = llvm::dyn_cast<NVVM::RequiresSMInterface>(op)) {
-              const NVVMCheckSMVersion requirement =
-                  reqOp.getRequiredMinSMVersion();
-              if (!requirement.isCompatibleWith(*targetFullSmVersion)) {
-                op->emitOpError() << "is not supported on " << getChip();
-                return WalkResult::interrupt();
-              }
-            }
-            return WalkResult::advance();
-          })
-          .wasInterrupted())
-    return failure();
-
-  return success();
-}
-
-#define GET_ATTRDEF_CLASSES
-#include "mlir/Dialect/LLVMIR/NVVMOpsAttributes.cpp.inc"

diff  --git a/mlir/lib/Target/LLVM/NVVM/Target.cpp b/mlir/lib/Target/LLVM/NVVM/Target.cpp
index 076a2d4350fc3c..b1ddbf11ff5108 100644
--- a/mlir/lib/Target/LLVM/NVVM/Target.cpp
+++ b/mlir/lib/Target/LLVM/NVVM/Target.cpp
@@ -15,7 +15,7 @@
 
 #include "mlir/Dialect/GPU/IR/CompilationInterfaces.h"
 #include "mlir/Dialect/GPU/IR/GPUDialect.h"
-#include "mlir/Dialect/LLVMIR/NVVMDialect.h"
+#include "mlir/Dialect/LLVMIR/NVVMAttributes.h"
 #include "mlir/IR/BuiltinDialect.h"
 #include "mlir/IR/BuiltinTypes.h"
 #include "mlir/IR/DialectResourceBlobManager.h"


        


More information about the Mlir-commits mailing list