050、从Vector到LLVM的SIMD指令生成 050、从Vector到LLVM的SIMD指令生成一个让我熬夜三天的bug去年做AI推理引擎的向量化后端时,遇到一个诡异现象:同样的MLIR向量化代码,在x86上跑出漂亮的AVX2指令,换到ARM Neon上却退化成标量循环。更离谱的是,某些情况下生成的LLVM IR里居然出现了extractelement和insertelement这种“拆箱”操作——明明我写的是vector4xf32,LLVM却把它当成四个独立的标量来处理。这个坑让我意识到:MLIR的Vector dialect到LLVM IR的lowering过程,远不是“直接映射”那么简单。今天这篇笔记,就聊聊这个过程中那些容易翻车的细节。Vector dialect的“假象”很多人以为MLIR的vector4xf32就是LLVM的4 x float,这是最大的误解。MLIR的Vector类型是一个抽象向量,它不承诺任何具体的寄存器宽度或指令集。当你写:%0 = vector.add %a, %b : vector4xf32这个操作在MLIR层面是合法的,但到了LLVM IR生成阶段,lowering p