046、Lowering(降级)的概念:从高层IR到底层IR

📅 2026/6/24 8:50:42
046、Lowering(降级)的概念:从高层IR到底层IR
046、Lowering(降级)的概念:从高层IR到底层IR一次让我熬夜到凌晨三点的Lowering事故去年做AI加速器编译器的时候,遇到一个诡异的bug:模型在训练框架里跑得好好的,经过MLIR编译后,推理结果全是NaN。我盯着IR dump看了整整两天,最后发现是某个自定义算子从Linalg降级到LLVM时,一个维度信息被错误地折叠了。那个晚上,我对着屏幕上的IR文本,第一次真正理解了什么叫“降级不是简单的翻译,而是信息重构”。如果你写过LLVM后端,一定见过类似场景:高层IR里一个清晰的循环嵌套,经过几轮pass之后变成了面目全非的标量指令。这就是Lowering——把抽象层次高的表示,逐步拆解成更接近硬件的表示。但这个过程远比“翻译”复杂,它涉及语义的丢失、约束的引入、以及无数个“这里踩过坑”的细节。降级到底在降什么?很多人以为Lowering就是“把A语言翻译成B语言”。别这样写代码,这种理解会让你在调试时抓狂。真正的降级,是在保留语义等价的前提下,降低抽象层次。举个例子,你在MLIR里写一个tensor4x8xf32的矩阵乘法,高层IR里可能只是一个linalg.matmul操作。这个操作表达的是“对两个二维张量做矩阵乘法”这个数学语义。但到了LLVM IR级别,你需要把它展开成:加载数据到寄存器循环遍历行和列乘加指令