Misc MLIR errors: for your convenience

The following is a log of some errors I’ve encountered in MLIR, and how I fixed them. Solutions to many of these were found through search engines and various forums (e.g., the LLVM forum), however I am centralising errors for my own reference. I believe that many of these are likely to be common errors for people initially exploring MLIR. Note that at the time of writing, MLIR is changing quickly, and some of these fixes may no longer be relevant. In fact, several of my issues below emerged due to such changes. I may add additional errors here over time.
func
custom op ‘func’ is unknown
error: custom op 'func' is unknown (tried 'builtin.func' as well)
At some point, MLIR made func
its own dialect.
Whereas before we would write:
func @do_something()
We now should write:
func.func @do_something()
However, this opened up another error for me, see below.
Dialect `func’ not found
Editing my MLIR code to func.func should work in principle, but trying to
compile my IR resulted in the error:
error: Dialect `func' not found for custom op 'func.func'
The issue was that the list of my optimizations (e.g.,
-convert-linalg-to-loops, -lower-affine, etc) did not include the one
required to process the new func dialect. Therefore, I needed to add
-convert-func-to-llvm (quite near the end of the passes).
Misc
error: Dialect `scf' not found for custom op 'scf.for'
This is the structured control flow dialect, which was being generated by some
of my other passes. However, I wasn’t lowering it further. Here I was missing
--convert-scf-to-cf for mlir-opt.
error: Dialect `memref' not found for custom op 'memref.load'
memref needs to be converted to LLVM. The --finalize-memref-to-llvm pass can
be used for this.
error: LLVM Translation failed for operation: builtin.unrealized_conversion_cast
Error: could not convert to LLVM IR
This appeared when I was attempting to execute some code with mlir-cpu-runner.
Adding --reconcile-unrealized-casts the pass to mlir-opt helped.
JIT session error: Symbols not found: [ print_memref_2d_f64 ]
Error: Failed to materialize symbols: { (main, { main, _mlir_main, _mlir_matmul, matmul }) }
This appeared when I was attempting to execute some code with mlir-cpu-runner.
Essentially, I was attempting to use the function print_memref_2d_f64, which
is a helper function defined in the mlir_runner_utils. But I was not linking
that library to mlir-cpu-runner. This was corrected by adding -shared-libs
with the path to libmlir_runner_utils.so to my mlir-cpu-runner call. You can
see the issue of how to support printing discussed in
this forum post, however
it is a bit out of date. E.g.:
mlir-cpu-runner -O3 -e main -entry-point-result=void \
-shared-libs=$LLVM_ROOT/build/lib/libmlir_runner_utils.so