Operation是MLIR中表示计算或控制流的一等公民,为IR最小可识别单元;其C++实例含名称、操作数/结果、属性、区域、位置五类核心字段,须通过Builder构造,不支持直接new,且语义由关联C++类、ODS约束及方言lowering规则共同定义。

Operation 是 MLIR 中表示计算或控制流的最小可识别单元,不是语法糖,也不是编译器内部临时产物——它是 IR 的一等公民,所有优化、验证、降级都围绕它展开。
Operation 在内存中长什么样
每个 Operation 实例是一个 C++ 对象(类型为 mlir::Operation*),包含五类核心字段:
-
getName():返回mlir::OperationName,本质是方言名 + 点 + 操作名,比如"toy.transpose"或"arith.addi" -
getOperands()和getResults():SSA 值列表,操作数来自上游Operation的结果或 Block 参数;结果可被下游直接引用 -
getAttrs():键值对字典,只存编译期常量,比如{inplace = true},不参与数据流 -
getRegions():可选嵌套区域(region),用于表达控制流结构(如scf.if的 then/else 块) -
getLoc():源码位置信息,调试和报错时关键,但不影响语义
注意:Operation 不持有类型系统逻辑,类型检查由 dialect 自行约定;也不隐含执行顺序——顺序由 SSA 使用关系和 region 结构共同决定。
为什么不能直接 new Operation?
你几乎不会手动构造 Operation 实例。原因有三:
- MLIR 强制使用 builder 模式:必须通过
OpBuilder或 dialect-specific builder(如arith::ConstantOp::build())创建,确保 operand/result 类型匹配、属性合法、region 正确初始化 - 直接
new mlir::Operation会绕过验证逻辑,导致后续verifyInvariants()失败,甚至触发断言崩溃 - Operation 生命周期绑定到
MLIRContext和所属Block,手动管理极易造成悬挂指针或内存泄漏
典型安全写法是:builder.create<:addiop>(loc, lhs, rhs)</:addiop>,而非 new arith::AddIOp(...)。
Operation 和 LLVM Instruction 的关键区别
别把 Operation 当成“高级版 LLVM 指令”。它们设计目标不同:
- LLVM IR 指令集封闭,
add、load等固定且不可扩展;Operation完全开放,任意 dialect 都可定义自己的foo.bar,无需改 MLIR 核心 - LLVM 指令无显式 region 概念,控制流靠 basic block 和 terminator;
Operation可自带 region,天然支持嵌套结构(如func.func包含整个函数体 region) - LLVM 指令属性极少(仅 debug location 和可选 metadata);
Operation属性是第一公民,且可通过 TableGen 自动生成验证逻辑(比如约束 “output shape must match input shape”)
这意味着:写一个新算子,你不是在 patch 编译器,而是在定义一个新方言下的 Operation,然后用 ODS(.td 文件)声明它——这才是 MLIR 扩展性的真正入口。
常见误判点:Operation 名字不是字符串字面量
看到 "toy.transpose" 别下意识当 C 字符串处理。它实际是 mlir::OperationName 类型,内部缓存了方言名与操作名的分离结构,并关联到注册的 C++ 类(如 toy::TransposeOp)。这意味着:
-
op->getName().getStringRef() == "toy.transpose"成立,但你不该依赖字符串比较做 dispatch - 正确做法是用
isa<:transposeop>(op)</:transposeop>或op->hasTrait<:isterminator>()</:isterminator> - 若自定义 operation 未注册进 context(比如忘了调
dialect->initialize()),getName()虽能取到字符串,但所有类型转换和 trait 查询都会失败
最易忽略的一点:Operation 的语义不在名字里,在它关联的 C++ 类实现、ODS 约束、以及所属 dialect 的 lowering 规则中——名字只是入口标识符,不是行为说明书。

















