[Mlir-commits] [mlir] [mlir][memref] Fix emulate narrow types for strided memref offset (PR #68181)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Oct 4 09:24:28 PDT 2023
================
@@ -209,6 +209,74 @@ struct ConvertMemRefLoad final : OpConversionPattern<memref::LoadOp> {
return success();
}
};
+
+//===----------------------------------------------------------------------===//
+// ConvertMemRefSubview
+//===----------------------------------------------------------------------===//
+
+struct ConvertMemRefSubview final : OpConversionPattern<memref::SubViewOp> {
+ using OpConversionPattern::OpConversionPattern;
+
+ LogicalResult
+ matchAndRewrite(memref::SubViewOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ auto convertedType =
+ cast<MemRefType>(getTypeConverter()->convertType(op.getSourceType()));
+ auto convertedElementType = convertedType.getElementType();
+ auto oldElementType = op.getSourceType().getElementType();
+ int srcBits = oldElementType.getIntOrFloatBitWidth();
+ int dstBits = convertedElementType.getIntOrFloatBitWidth();
+ if (dstBits % srcBits != 0) {
+ return rewriter.notifyMatchFailure(
+ op, "only dstBits % srcBits == 0 supported");
+ }
+
+ MemRefType newTy =
+ cast<MemRefType>(getTypeConverter()->convertType(op.getType()));
+ if (!newTy) {
+ return rewriter.notifyMatchFailure(
+ op->getLoc(),
+ llvm::formatv("failed to convert memref type: {0}", op.getType()));
+ }
+
+ // Only support offset for 1-D subview.
+ if (op.getType().getRank() != 1) {
+ return rewriter.notifyMatchFailure(
+ op->getLoc(), "subview with rank > 1 is not supported");
+ }
+
+ // Only support stride of 1.
+ if (op.getStaticStride(0) != 1) {
+ return rewriter.notifyMatchFailure(
+ op->getLoc(), "subview with stride != 1 is not supported");
+ }
+
+ auto size = op.getStaticSize(0);
+ auto offset = op.getStaticOffset(0);
+ // Only support static sizes and offsets.
+ if (size == ShapedType::kDynamic || offset == ShapedType::kDynamic) {
+ return rewriter.notifyMatchFailure(
+ op->getLoc(), "subview with dynamic size or offset is not supported");
+ }
+
+ int elementsPerByte = dstBits / srcBits;
+ if (size % elementsPerByte != 0 || offset % elementsPerByte != 0) {
----------------
MaheshRavishankar wrote:
I think you can drop the size constraint and make the size of the new `memref.subview` `ceilDiv(size, elementsPerByte)`.
https://github.com/llvm/llvm-project/pull/68181
More information about the Mlir-commits
mailing list