diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1060,9 +1060,13 @@ LogicalResult ModuleTranslation::convertFunctions() { // Convert functions. for (auto function : getModuleBody(mlirModule).getOps()) { - // Ignore external functions. - if (function.isExternal()) + // Do not convert external functions, but do process dialect attributes + // attached to them. + if (function.isExternal()) { + if (failed(convertDialectAttributes(function))) + return failure(); continue; + } if (failed(convertOneFunction(function))) return failure(); diff --git a/mlir/test/Target/LLVMIR/external-func-dialect-attr.mlir b/mlir/test/Target/LLVMIR/external-func-dialect-attr.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Target/LLVMIR/external-func-dialect-attr.mlir @@ -0,0 +1,11 @@ +// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s + +// Check that dialect attributes are processed for external functions. +// This might not be an intended use case for `nvvm.minctasm`, but it enables +// testing this feature easily. + +module { + llvm.func external @f() attributes { nvvm.minctasm = 10 : i32 } + // CHECK: !nvvm.annotations = !{![[NVVM:[0-9]+]]} + // CHECK: ![[NVVM]] = !{ptr @f, !"minctasm", i32 10} +}