050、从Vector到LLVM的SIMD指令生成
📅 2026/7/23 13:43:09
👁️ 阅读次数
📝 编程学习
050、从Vector到LLVM的SIMD指令生成
一个让我熬夜三天的bug
去年做AI推理引擎的向量化后端时,遇到一个诡异现象:同样的MLIR向量化代码,在x86上跑出漂亮的AVX2指令,换到ARM Neon上却退化成标量循环。更离谱的是,某些情况下生成的LLVM IR里居然出现了extractelement和insertelement这种“拆箱”操作——明明我写的是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
编程学习
技术分享
实战经验