050、从Vector到LLVM的SIMD指令生成

050、从Vector到LLVM的SIMD指令生成

一个让我熬夜三天的bug

去年做AI推理引擎的向量化后端时,遇到一个诡异现象:同样的MLIR向量化代码,在x86上跑出漂亮的AVX2指令,换到ARM Neon上却退化成标量循环。更离谱的是,某些情况下生成的LLVM IR里居然出现了extractelementinsertelement这种“拆箱”操作——明明我写的是vector<4xf32>,LLVM却把它当成四个独立的标量来处理。

这个坑让我意识到:MLIR的Vector dialect到LLVM IR的lowering过程,远不是“直接映射”那么简单。今天这篇笔记,就聊聊这个过程中那些容易翻车的细节。

Vector dialect的“假象”

很多人以为MLIR的vector<4xf32>就是LLVM的<4 x float>,这是最大的误解。MLIR的Vector类型是一个抽象向量,它不承诺任何具体的寄存器宽度或指令集。当你写:

%0 = vector.add %a, %b : vector<4xf32>

这个操作在MLIR层面是合法的,但到了LLVM IR生成阶段,lowering p