mlir-translate -mlir-to-llvmir 报错是因为它仅接受纯 llvm dialect ir,不支持 std、arith、memref 等高层操作;需先用 mlir-opt 完成全套 lowering(如 -convert-std-to-llvm 等),确保所有 op 均为 llvm.* 开头,再导出。

能直接导出,但必须确保输入 MLIR 已降到 LLVM Dialect 层级,否则 mlir-translate -mlir-to-llvmir 会报错退出。
为什么 mlir-translate -mlir-to-llvmir 报错 “unknown dialect” 或 “illegal operation”
因为 mlir-translate 的 -mlir-to-llvmir 模式只接受纯 LLVM dialect 的 IR(即所有 op 都是 llvm.func、llvm.call、llvm.mlir.constant 等),不接受 std、arith、memref、affine 或自定义 dialect(如 toy)的 op。
常见错误现象:
error: 'std.addi' op is not legal in this contexterror: unknown dialect 'arith'-
Segmentation fault (core dumped)(当 IR 中混有未降级的 high-level op 且工具未做充分校验时)
所以不是“命令写错了”,而是 IR 还没准备好。你得先用 mlir-opt 做完全套 lowering 到 LLVM dialect,再交给 mlir-translate。
怎么一步步把任意 MLIR 降到可导出的 LLVM IR
假设你有一个 add.mlir,含 func、arith.addi、memref.alloc 等标准 op:
- 先确认当前 MLIR 是否已到 LLVM dialect:运行
mlir-opt add.mlir --print-op-on-failure,看输出里是否只有llvm.开头的 op - 如果没有,用
mlir-opt执行 lowering 链:mlir-opt add.mlir -convert-std-to-llvm -convert-memref-to-llvm -convert-scf-to-cf -convert-cf-to-llvm -convert-arith-to-llvm > add.llvm-dialect.mlir - 注意顺序:必须先转
scf和cf(控制流),再转arith/memref,否则llvmdialect 构建器可能找不到合法 terminator - 检查中间结果:
cat add.llvm-dialect.mlir | grep "llvm\."应该有大量llvm.func、llvm.alloca、llvm.add等
mlir-translate -mlir-to-llvmir 的实际调用与参数陷阱
导出前务必确认输入文件是 LLVM dialect IR,然后执行:
mlir-translate -mlir-to-llvmir add.llvm-dialect.mlir > add.ll
关键细节:
- 不支持
--split-input-file或--allow-unregistered-dialect与-mlir-to-llvmir共用 —— 它们会静默忽略非法 op 导致生成空或损坏的.ll - 若 IR 含外部符号(如
@printf),需确保模块里已有对应llvm.func声明,否则mlir-translate不报错但 llvm-as 会失败 - 生成的
.ll是 LLVM IR 文本格式,可用llvm-as编译为 bitcode:llvm-as add.ll -o add.bc - 不要试图对含
gpu.module或nvgpu.launch的 IR 直接用这个 flag —— 它们属于 GPU dialect,须走SerializeToCubinPass等专用 pass
容易被忽略的兼容性坑:MLIR 版本与 LLVM IR 版本绑定
mlir-translate 输出的 LLVM IR 版本由其编译时链接的 LLVM 版本决定,不是由输入 MLIR 决定的。例如:
- 用 LLVM 16 编译的
mlir-translate会输出 LLVM 16 IR(含!dbg元数据格式、!tbaa结构等) - 若下游要用 LLVM 15 的
llc编译,可能因元数据不兼容报Invalid record - 解决方法:统一构建环境;或用
llvm-dis+llvm-as转换 IR 版本(不推荐,易丢调试信息)
最稳妥的做法是:整个 toolchain(mlir-opt、mlir-translate、llc)都来自同一 LLVM 构建目录,且 -DLLVM_TARGETS_TO_BUILD 包含目标后端(如 NVPTX)。











