[Mlir-commits] [mlir] e141da8 - [mlir][ExecutionEngine] fix default free function in `OwningMemRef`. (#153133)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Aug 13 03:23:07 PDT 2025
Author: Baz
Date: 2025-08-13T10:23:04Z
New Revision: e141da8a629c2addc0a3eff730a772146577a2e5
URL: https://github.com/llvm/llvm-project/commit/e141da8a629c2addc0a3eff730a772146577a2e5
DIFF: https://github.com/llvm/llvm-project/commit/e141da8a629c2addc0a3eff730a772146577a2e5.diff
LOG: [mlir][ExecutionEngine] fix default free function in `OwningMemRef`. (#153133)
`basePtr` should be freed instead of `data` because it is the one which
is storing the output of `malloc`. In `allocAligned()`, the `data` is
malloced and then assigned to `basePtr`.
Added:
Modified:
mlir/include/mlir/ExecutionEngine/MemRefUtils.h
mlir/unittests/ExecutionEngine/Invoke.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/ExecutionEngine/MemRefUtils.h b/mlir/include/mlir/ExecutionEngine/MemRefUtils.h
index 6e72f7c23bdcf..d66d757cb7a8e 100644
--- a/mlir/include/mlir/ExecutionEngine/MemRefUtils.h
+++ b/mlir/include/mlir/ExecutionEngine/MemRefUtils.h
@@ -151,7 +151,7 @@ class OwningMemRef {
AllocFunType allocFun = &::malloc,
std::function<void(StridedMemRefType<T, Rank>)> freeFun =
[](StridedMemRefType<T, Rank> descriptor) {
- ::free(descriptor.data);
+ ::free(descriptor.basePtr);
})
: freeFunc(freeFun) {
if (shapeAlloc.empty())
diff --git a/mlir/unittests/ExecutionEngine/Invoke.cpp b/mlir/unittests/ExecutionEngine/Invoke.cpp
index 887db227cfc4b..312b10f28143f 100644
--- a/mlir/unittests/ExecutionEngine/Invoke.cpp
+++ b/mlir/unittests/ExecutionEngine/Invoke.cpp
@@ -205,7 +205,13 @@ TEST(NativeMemRefJit, SKIP_WITHOUT_JIT(BasicMemref)) {
};
int64_t shape[] = {k, m};
int64_t shapeAlloc[] = {k + 1, m + 1};
- OwningMemRef<float, 2> a(shape, shapeAlloc, init);
+ // Use a large alignment to stress the case where the memref data/basePtr are
+ // disjoint.
+ int alignment = 8192;
+ OwningMemRef<float, 2> a(shape, shapeAlloc, init, alignment);
+ ASSERT_EQ(
+ (void *)(((uintptr_t)a->basePtr + alignment - 1) & ~(alignment - 1)),
+ a->data);
ASSERT_EQ(a->sizes[0], k);
ASSERT_EQ(a->sizes[1], m);
ASSERT_EQ(a->strides[0], m + 1);
More information about the Mlir-commits
mailing list