MLIR的Verifier:Operation与Type的合法性检查从一次半夜的crash说起凌晨两点,我盯着终端里那段MLIR的dump发呆。一个看起来人畜无害的tosa.conv2d操作,输入tensor的element type是i8,weights是i8,但bias居然是f32。编译器没有报错,一路跑到后端,在代码生成阶段直接segfault。我花了三个小时才定位到问题——MLIR的Verifier没有捕获这个类型不匹配。这个教训让我意识到:Verifier不是摆设,它是MLIR基础设施里最容易被低估的防线。今天我们就来聊聊这个“守门员”到底怎么工作,以及如何写出不会半夜被叫醒的合法Operation和Type。Verifier到底在检查什么MLIR的Verifier不是单一的函数,而是一套分层检查机制。它会在每个IR构造完成时自动触发,比如OpBuilder::create之后、mlir-opt的pass pipeline运行之前。如果你手动构造IR然后跳过验证直接输出,恭喜你,你正在埋雷。核心检查分三层:第一层:结构完整性。每个Operation必须有正确的operand数量、result数量、region数量。比如arith.addi必须有两