Published on

Util Dialect 详解

Authors
  • avatar
    Name
    alan
    Twitter

Dialect 名称: util C++ 命名空间: ::mlir::iree_compiler::IREE::Util 主要用途: IREE 各子 Dialect 共享的通用类型和工具 Op


目录

  1. 概述
  2. 文件结构
  3. 通用类型定义
  4. 属性定义
  5. Op Trait
  6. 基类定义
  7. 关键 Interface
  8. 核心 Op 列表

1. 概述

Util Dialect 是 IREE 编译器中最基础的 Dialect,为其他所有 IREE Dialect(Flow、Stream、HAL、VM 等)提供共享的类型、属性、接口和工具 Op。

设计目标:

  • 提供跨 IREE 子 Dialect 通用的类型定义
  • 统一的基类和接口规范
  • 减少代码重复
  • 促进模块化设计

2. 文件结构

文件内容依赖
UtilBase.td核心 Dialect 定义、基础类、通用类型别名、Op Trait无(最底层)
UtilAttrs.td所有 Dialect 特定的 Attribute 定义UtilBase.td
UtilInterfaces.td所有 Dialect 特定的 Interface 定义UtilBase.td
UtilTypes.td所有 Dialect 特定的 Type 定义UtilBase.td、UtilInterfaces.td
UtilOps.td所有 Dialect 特定的 Operation 定义UtilBase.td、UtilInterfaces.td、UtilTypes.td

3. 通用类型定义

类型别名/约束

定义名等价类型说明
Util_BoolI1 或 I8布尔存储类型(1 或 8 位整数)
Util_Element任意无符号整数或浮点数元素类型
Util_TensorTensorOf<[Util_Element]>包含通用元素的 Tensor
Util_PrimitiveIndex、任意整数、任意浮点数原始类型
Util_FillPattern整数、浮点数或 Index填充模式类型
Util_OffsetIndex偏移量(Index 类型别名)
Util_SizeIndex大小(Index 类型别名)
Util_RangeIndex 或任意整数范围类型
Util_StatusI32状态码(32 位整数)

4. 属性定义

属性名类型说明
Util_IndexAttrIndex 属性要求是 Index 类型的 IntegerAttr
Util_TiedOpStorageAttr64 位整数数组Tied op 存储属性
Util_GlobalRefAttrFlatSymbolRefAttr全局引用属性的别名
Util_AnySerializableAttr可序列化属性包括 DenseElementsAttr、DenseResourceElementsAttr 或实现了 SerializableAttrInterface 的属性
Util_AnySerializableArrayAttr可序列化数组可序列化属性的数组
Util_AliasedSymbolRefAttr符号引用符号引用属性的别名版本

5. Op Trait

Trait 名称C++ 类名用途
Util_YieldPointIREE::Util::YieldPoint标记 yield 语义点
Util_UnsafeIREE::Util::Unsafe标记"不安全"的操作。不可信模块中包含此标记的 op 会在运行时验证失败
Util_DebugOnlyIREE::Util::DebugOnly标记仅在 Debug 构建中有效的操作。会被 --iree-util-strip-debug-ops Pass 移除
Util_ObjectLikeIREE::Util::ObjectLike标记类对象声明的 op(类/表等)。必须是符号表且与上层隔离
Util_UnreachableLikeIREE::Util::UnreachableLike标记运行时不可达代码的 op

6. 基类定义

Op 基类

class Util_Op<string mnemonic, list<Trait> traits = []>
    : Op<Util_Dialect, mnemonic, traits> {
  let hasCustomAssemblyFormat = 1;    // 使用自定义汇编格式
  Util_OpDocMetadata docMetadata = ?;  // 可选的文档元数据
}

class Util_PureOp<string mnemonic, list<Trait> traits = []>
    : Util_Op<mnemonic, !listconcat(traits, [Pure])>;

Type 基类

class Util_TypeDef<string name, list<Trait> traits = []>
    : TypeDef<Util_Dialect, name, traits> {
  Util_TypeDocMetadata docMetadata = ?;
}

Attr 基类

class Util_AttrDef<string name, list<Trait> traits = []>
    : AttrDef<Util_Dialect, name, traits> {
  Util_AttrDocMetadata docMetadata = ?;
}

Interface 基类

class Util_OpInterface<string name, list<Interface> baseInterfaces = []>
    : OpInterface<name, baseInterfaces> {
  let cppNamespace = "::mlir::iree_compiler::IREE::Util";
}

7. 关键 Interface

7.1 GlobalAccessOpInterface

全局变量访问操作接口,用于标记可以访问全局变量的 Op。

7.2 ShapeAwareOpInterface

形状感知操作接口,用于在编译时跟踪和优化张量形状。

7.3 TiledOpInterface

支持 tiling 的操作接口,用于代码生成阶段的分块优化。


8. 核心 Op 列表

8.1 全局变量相关

Op 名称说明
util.global全局变量声明
util.global.load加载全局变量
util.global.store存储全局变量

8.2 内存/缓冲区相关

Op 名称说明
util.buffer缓冲区操作
util.buffer.alloc分配缓冲区
util.buffer.subspan获取缓冲区子范围

8.3 控制流相关

Op 名称说明
util.scf.if结构化控制流 if
util.scf.for结构化控制流 for 循环
util.scf.while结构化控制流 while 循环

8.4 工具/调试相关

Op 名称说明
util.unreachable不可达代码标记
util.trace追踪操作(调试用)
util.optimization_barrier优化屏障

总结

Util Dialect 是 IREE 编译器的基础设施层,提供了:

  • ✅ 统一的类型系统基础
  • ✅ 共享的属性定义
  • ✅ 标准 Op Trait 集合
  • ✅ 模块化的基类架构
  • ✅ 跨 Dialect 复用的工具 Op

所有其他 IREE Dialect 都直接或间接地依赖于 Util Dialect。