diff --git a/mlir/include/mlir/ExecutionEngine/RunnerUtils.h b/mlir/include/mlir/ExecutionEngine/RunnerUtils.h --- a/mlir/include/mlir/ExecutionEngine/RunnerUtils.h +++ b/mlir/include/mlir/ExecutionEngine/RunnerUtils.h @@ -159,7 +159,7 @@ int64_t rank, int64_t offset, const int64_t *sizes, const int64_t *strides) { if (dim == 0) { - os << base[offset]; + os << base[offset] << "@" << &base[offset]; return; } printFirst(os, base, dim, rank, offset, sizes, strides); @@ -217,12 +217,16 @@ // Currently exposed C API. //////////////////////////////////////////////////////////////////////////////// extern "C" MLIR_RUNNERUTILS_EXPORT void +_mlir_ciface_print_memref_i1(UnrankedMemRefType *M); +extern "C" MLIR_RUNNERUTILS_EXPORT void _mlir_ciface_print_memref_i8(UnrankedMemRefType *M); extern "C" MLIR_RUNNERUTILS_EXPORT void _mlir_ciface_print_memref_f32(UnrankedMemRefType *M); extern "C" MLIR_RUNNERUTILS_EXPORT void _mlir_ciface_print_memref_f64(UnrankedMemRefType *M); +extern "C" MLIR_RUNNERUTILS_EXPORT void print_memref_i1(int64_t rank, + void *ptr); extern "C" MLIR_RUNNERUTILS_EXPORT void print_memref_i32(int64_t rank, void *ptr); extern "C" MLIR_RUNNERUTILS_EXPORT void print_memref_i64(int64_t rank, diff --git a/mlir/integration_test/Dialect/Standard/CPU/bug.mlir b/mlir/integration_test/Dialect/Standard/CPU/bug.mlir new file mode 100644 --- /dev/null +++ b/mlir/integration_test/Dialect/Standard/CPU/bug.mlir @@ -0,0 +1,34 @@ +// RUN: mlir-opt %s -lower-affine -convert-vector-to-llvm -print-ir-after-all | \ +// RUN: mlir-translate -mlir-to-llvmir + +// RUN: mlir-opt %s -lower-affine -convert-vector-to-llvm | \ +// RUN: mlir-cpu-runner -e main -entry-point-result=void \ +// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext + +func @main() -> () { + %mem = alloca() : memref<3xi1> + + %c0 = constant 0 : index + %c1 = constant 1 : index + %c2 = constant 2 : index + + %true = constant true + %false = constant false + + store %false, %mem[%c0] : memref<3xi1> + store %true, %mem[%c1] : memref<3xi1> + store %true, %mem[%c2] : memref<3xi1> + + %scalar = load %mem[%c1] : memref<3xi1> + vector.print %scalar : i1 + + %v = affine.vector_load %mem[0] : memref<3xi1>, vector<3xi1> + vector.print %v : vector<3xi1> + + %unranked = memref_cast %mem : memref<3xi1> to memref<*xi1> + call @print_memref_i1(%unranked) : (memref<*xi1>) -> () + + return + } + +func private @print_memref_i1(%ptr : memref<*xi1>) attributes { llvm.emit_c_interface } diff --git a/mlir/lib/ExecutionEngine/RunnerUtils.cpp b/mlir/lib/ExecutionEngine/RunnerUtils.cpp --- a/mlir/lib/ExecutionEngine/RunnerUtils.cpp +++ b/mlir/lib/ExecutionEngine/RunnerUtils.cpp @@ -24,6 +24,9 @@ impl::printMemRef(*M); } +extern "C" void _mlir_ciface_print_memref_i1(UnrankedMemRefType *M) { + impl::printMemRef(*M); +} extern "C" void _mlir_ciface_print_memref_i8(UnrankedMemRefType *M) { impl::printMemRef(*M); } @@ -44,6 +47,11 @@ impl::printMemRef(*M); } +extern "C" void print_memref_i1(int64_t rank, void *ptr) { + UnrankedMemRefType descriptor = {rank, ptr}; + _mlir_ciface_print_memref_i1(&descriptor); +} + extern "C" void print_memref_i32(int64_t rank, void *ptr) { UnrankedMemRefType descriptor = {rank, ptr}; _mlir_ciface_print_memref_i32(&descriptor);