
029、Arith Dialect:标量算术运算的表示昨晚调试一个自定义算子融合的pass,跑完MLIR优化流水线后,发现生成的LLVM IR里多了一堆奇怪的select指令。追了半天,源头是Arith Dialect里一个arith.addi被错误地转换成了arith.select——因为我在写pattern rewrite时,把arith.addi的operand类型搞混了,导致类型不匹配触发了隐式的类型转换路径。这种坑,踩过一次就记住了:Arith Dialect看似简单,但它的类型系统和操作语义,是MLIR里所有数值计算的基础,搞不清楚后面全是雷。Arith Dialect的定位:最底层的算术积木Arith Dialect在MLIR生态里扮演的角色,就是提供一组最基础、最纯粹的标量算术运算。它不关心张量、不关心向量、不关心任何高级数据结构,只处理IntegerType和FloatType这些基本类型上的加减乘除、比较、转换。你可以把它想象成LLVM IR里的算术指令,但比LLVM更干净——没有隐式的类型提升,没有C语言那种整数提升规则,所有操作都是显式的、类型精确的。在MLIR的Dialect层级中,Arith通常位于Linalg、Vector这些高级Dialect的下方。当你把linalg.generic或者tensor上的运算lower到标量级别时,最终落地