上的代码生成)
MLIR在RISC-V向量扩展(V扩展)上的代码生成一个让我熬夜到凌晨三点的bug去年做AI推理引擎的RISC-V后端移植,遇到一个诡异现象:同样的MLIR向量化IR,在x86 AVX512上跑得飞起,换到RISC-V V扩展上就频繁触发非法指令异常。抓破头皮调了两天,最后发现是MLIR的向量类型转换阶段,把8 x i32直接映射成了RISC-V的LMUL=8配置——但目标芯片的VLEN只有128位,根本塞不下8个32位整数。这个坑让我意识到,MLIR在RISC-V V扩展上的代码生成,远不是简单的“把LLVM IR翻译成RISC-V汇编”那么简单。向量长度、寄存器分组、掩码处理、循环展开策略,每一个环节都可能让你在深夜对着GDB发呆。MLIR与RISC-V V扩展的对话机制MLIR的向量化流水线走到LLVM方言这一步时,会生成llvm.intr.vp.*系列内建函数。这些内建函数携带向量长度参数(EVL,Effective Vector Length),恰好对应RISC-V V扩展的vsetvli指令语义。但问题在于,MLIR默认假设目标平台支持任意向量长度,而RISC-V的VLEN是硬件固定的——你没法在一条指令里塞进超过VLEN位宽的数据。我习惯在MLIR的-convert-vector-to-llvmpass之后,插入一个自定义的RISC-V向量合法化pass。这个pass的核心逻辑很简