[Mlir-commits] [mlir] [memref] Support dense resources for memref-to-llvm (PR #79380)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Jan 24 14:18:09 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: Rob Suderman (rsuderman)
<details>
<summary>Changes</summary>
Memref to llvm did not handle the DenseResourceElementsAttr. Reworked
the lowering so that it converts to a valid LLVM type.
---
Full diff: https://github.com/llvm/llvm-project/pull/79380.diff
2 Files Affected:
- (modified) mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp (+16-7)
- (modified) mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir (+15)
``````````diff
diff --git a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
index 2bfca303b5fd48..8fd1f37acdad6c 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
+++ b/mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
@@ -23,6 +23,7 @@
#include "mlir/Dialect/MemRef/Utils/MemRefUtils.h"
#include "mlir/IR/AffineMap.h"
#include "mlir/IR/BuiltinTypes.h"
+#include "mlir/IR/DialectResourceBlobManager.h"
#include "mlir/IR/IRMapping.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Support/MathExtras.h"
@@ -501,13 +502,21 @@ struct GlobalMemrefOpLowering
Attribute initialValue = nullptr;
if (!global.isExternal() && !global.isUninitialized()) {
- auto elementsAttr = llvm::cast<ElementsAttr>(*global.getInitialValue());
- initialValue = elementsAttr;
-
- // For scalar memrefs, the global variable created is of the element type,
- // so unpack the elements attribute to extract the value.
- if (type.getRank() == 0)
- initialValue = elementsAttr.getSplatValue<Attribute>();
+ Attribute initialAttr = *global.getInitialValue();
+ if (auto resourceAttr = llvm::dyn_cast<DenseResourceElementsAttr>(initialAttr)) {
+ auto blob = resourceAttr.getRawHandle().getBlob();
+ initialAttr = DenseElementsAttr::getFromRawBuffer(
+ resourceAttr.getType(), blob->getData());
+ }
+
+ if (auto elementsAttr = llvm::cast<ElementsAttr>(initialAttr)) {
+ initialValue = elementsAttr;
+
+ // For scalar memrefs, the global variable created is of the element type,
+ // so unpack the elements attribute to extract the value.
+ if (type.getRank() == 0)
+ initialValue = elementsAttr.getSplatValue<Attribute>();
+ }
}
uint64_t alignment = global.getAlignment().value_or(0);
diff --git a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
index 37999d6fc14ad1..9e00fd1bb5c73c 100644
--- a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
+++ b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
@@ -330,6 +330,21 @@ memref.global "private" @gv4 : memref<f32> = dense<1.0> {alignment = 64}
// -----
+module {
+ // CHECK: llvm.mlir.global private constant @__constant_xf32(1.41421354 : f32) {addr_space = 0 : i32} : f32
+ memref.global "private" constant @__constant_xf32 : memref<f32> = dense_resource<NAME>
+}
+
+{-#
+ dialect_resources: {
+ builtin: {
+ NAME: "0x08000000F304B53F"
+ }
+ }
+#-}
+
+// -----
+
// Expand shapes need to be expanded outside of the memref-to-llvm pass.
// CHECK-LABEL: func @expand_shape_static(
// CHECK-SAME: %[[ARG:.*]]: memref<{{.*}}>)
``````````
</details>
https://github.com/llvm/llvm-project/pull/79380
More information about the Mlir-commits
mailing list