[Mlir-commits] [mlir] [mlir][Target] Teach dense_resource conversion to LLVMIR Target (PR #78958)
Kunwar Grover
llvmlistbot at llvm.org
Mon Jan 22 10:27:36 PST 2024
================
@@ -446,6 +447,90 @@ convertDenseElementsAttr(Location loc, DenseElementsAttr denseElementsAttr,
return buildSequentialConstant(constantsRef, outerShape, llvmType, loc);
}
+/// Convert a dense resource elements attribute to an LLVM IR constant using its
+/// raw data storage if possible. This supports elements attributes of tensor or
+/// vector type and avoids constructing separate objects for individual values
+/// of the innermost dimension. Constants for other dimensions are still
+/// constructed recursively. Returns null if constructing from raw data is not
+/// supported for this type, e.g., element type is not a power-of-two-sized
+/// primitive. Reports other errors at `loc`.
+static llvm::Constant *convertDenseResourceElementsAttr(
+ Location loc, DenseResourceElementsAttr denseResourceAttr,
+ llvm::Type *llvmType, const ModuleTranslation &moduleTranslation) {
+ if (!denseResourceAttr)
+ return nullptr;
+
+ llvm::Type *innermostLLVMType = getInnermostElementType(llvmType);
+ if (!llvm::ConstantDataSequential::isElementTypeCompatible(innermostLLVMType))
+ return nullptr;
+
+ ShapedType type = denseResourceAttr.getType();
+ if (type.getNumElements() == 0)
+ return nullptr;
+
+ ArrayRef<char> rawData =
+ denseResourceAttr.getRawHandle().getBlob()->getData();
+
+ // Check that the raw data size matches what is expected for the scalar size.
+ // TODO: in theory, we could repack the data here to keep constructing from
+ // raw data.
+ // TODO: we may also need to consider endianness when cross-compiling to an
+ // architecture where it is different.
+ int64_t numElements = denseResourceAttr.getType().getNumElements();
+ int64_t elementByteSize = rawData.size() / numElements;
+ if (8 * elementByteSize != innermostLLVMType->getScalarSizeInBits())
+ return nullptr;
+
+ // Compute the shape of all dimensions but the innermost. Note that the
+ // innermost dimension may be that of the vector element type.
+ bool hasVectorElementType = isa<VectorType>(type.getElementType());
+ int64_t numAggregates =
+ numElements / (hasVectorElementType
+ ? 1
+ : denseResourceAttr.getType().getShape().back());
----------------
Groverkss wrote:
There is a check for getNumElements == 0 at the start. So that case should never arise here.
https://github.com/llvm/llvm-project/pull/78958
More information about the Mlir-commits
mailing list