[Mlir-commits] [mlir] Expand the MemRefToEmitC pass - Lowering `AllocOp` (PR #148257)
Jaden Angella
llvmlistbot at llvm.org
Fri Jul 11 09:06:15 PDT 2025
https://github.com/Jaddyen created https://github.com/llvm/llvm-project/pull/148257
This aims to lower `memref.alloc` to `emitc.call_opaque “malloc” `
>From 256dc1144140685f98df8cf33d0e1fdbaa7f1694 Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Fri, 11 Jul 2025 00:23:11 +0000
Subject: [PATCH] allocop to emitc malloc
---
.../MemRefToEmitC/MemRefToEmitC.cpp | 36 +++++++++++++++++--
.../MemRefToEmitC/memref-to-emitc.mlir | 8 +++++
2 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index db244d1d1cac8..382affaff429f 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -77,6 +77,38 @@ struct ConvertAlloca final : public OpConversionPattern<memref::AllocaOp> {
}
};
+struct ConvertAlloc final : public OpConversionPattern<memref::AllocOp> {
+ using OpConversionPattern::OpConversionPattern;
+ LogicalResult
+ matchAndRewrite(memref::AllocOp allocOp, OpAdaptor operands,
+ ConversionPatternRewriter &rewriter) const override {
+ mlir::Location loc = allocOp.getLoc();
+ auto memrefType = allocOp.getType();
+ if (!memrefType.hasStaticShape())
+ return rewriter.notifyMatchFailure(
+ allocOp.getLoc(), "cannot transform alloc op with dynamic shape");
+
+ int64_t totalSize =
+ memrefType.getNumElements() * memrefType.getElementTypeBitWidth() / 8;
+ auto alignment = allocOp.getAlignment();
+ if (alignment) {
+ int64_t alignVal = alignment.value();
+ totalSize = (totalSize + alignVal - 1) / alignVal * alignVal;
+ }
+ mlir::Value sizeBytes = rewriter.create<emitc::ConstantOp>(
+ loc, rewriter.getIndexType(),
+ rewriter.getIntegerAttr(rewriter.getIndexType(), totalSize));
+ auto mallocPtrType = emitc::PointerType::get(rewriter.getContext(),
+ memrefType.getElementType());
+ auto mallocCall = rewriter.create<emitc::CallOpaqueOp>(
+ loc, mallocPtrType, rewriter.getStringAttr("malloc"),
+ mlir::ValueRange{sizeBytes});
+
+ rewriter.replaceOp(allocOp, mallocCall);
+ return success();
+ }
+};
+
struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
using OpConversionPattern::OpConversionPattern;
@@ -222,6 +254,6 @@ void mlir::populateMemRefToEmitCTypeConversion(TypeConverter &typeConverter) {
void mlir::populateMemRefToEmitCConversionPatterns(
RewritePatternSet &patterns, const TypeConverter &converter) {
- patterns.add<ConvertAlloca, ConvertGlobal, ConvertGetGlobal, ConvertLoad,
- ConvertStore>(converter, patterns.getContext());
+ patterns.add<ConvertAlloca, ConvertAlloc, ConvertGlobal, ConvertGetGlobal,
+ ConvertLoad, ConvertStore>(converter, patterns.getContext());
}
diff --git a/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir b/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
index d37fd1de90add..23e1c20670f8c 100644
--- a/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
+++ b/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
@@ -8,6 +8,14 @@ func.func @alloca() {
return
}
+// CHECK-LABEL: alloc()
+func.func @alloc() {
+ // CHECK-NEXT: %0 = "emitc.constant"() <{value = 3996 : index}> : () -> index
+ // CHECK-NEXT: %1 = emitc.call_opaque "malloc"(%0) : (index) -> !emitc.ptr<i32>
+ %alloc = memref.alloc() : memref<999xi32>
+ return
+}
+
// -----
// CHECK-LABEL: memref_store
More information about the Mlir-commits
mailing list