[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