Published on

iree-opt 功能分类

Authors
  • avatar
    Name
    alan
    Twitter

基于 iree-opt --help 输出整理,约 400+ 个 pass 和 50+ 个 pass pipeline。


使用方法

运行单个 pass

iree-opt --pass-name input.mlir

例如运行 cse(公共子表达式消除):

iree-opt --cse input.mlir

运行多个 pass

用 --pass-pipeline 指定完整的 pipeline,pass 之间用空格分隔:

iree-opt --pass-pipeline="cse canonicalize inline" input.mlir

嵌套 pipeline(带参数)

某些 pass 需要传参,用括号包裹:

iree-opt --pass-pipeline="builtin.module(canonicalize{max-iterations=10} cse)" input.mlir

或者逐 pass 调用(每个 pass 独立运行):

iree-opt --cse --canonicalize input.mlir

查看 IR 变化

调试时最常用,打印每个 pass 前后的 IR:

# 打印所有 pass 之后的 IR
iree-opt --mlir-print-ir-after-all --pass-pipeline="cse canonicalize" input.mlir

# 只看特定 pass 前后的 IR
iree-opt --mlir-print-ir-before="cse" --mlir-print-ir-after="cse" --cse input.mlir

# 仅在 IR 发生变化时打印
iree-opt --mlir-print-ir-after-all --mlir-print-ir-after-change --pass-pipeline="..." input.mlir

实际示例

# 1. 只看某个 IREE pass 做了什么
iree-opt --iree-flow-canonicalize input.mlir

# 2. 组合多个 IREE pass
iree-opt --pass-pipeline="builtin.module(iree-flow-canonicalize cse iree-util-fold-globals)" input.mlir

# 3. 运行完整的 flow transformation pipeline
iree-opt --iree-flow-transformation-pipeline input.mlir

# 4. 运行 dispatch creation pipeline(形成 dispatch 区域)
iree-opt --iree-dispatch-creation-pipeline input.mlir

# 5. 查看每个 pass 的统计信息
iree-opt --mlir-pass-statistics --pass-pipeline="builtin.module(cse canonicalize inline)" input.mlir

# 6. 每个 pass 后验证 IR 正确性
iree-opt --verify-each --pass-pipeline="builtin.module(cse canonicalize)" input.mlir

查看有哪些 pass

# 列出所有已注册的 pass
iree-opt --list-passes

# 列出所有已注册的 dialect
iree-opt --show-dialects

注意事项

  1. --pass-pipeline 需要顶层操作:大多数 pipeline 需要用 builtin.module(...) 包裹,因为 pass 是作用在 module 上的。
  2. pass 执行顺序很重要:IREE 的 pipeline 有严格的前后依赖关系,单个调试时可以只跑某个 pass 看效果,但完整编译需要用官方 pipeline。
  3. -o 指定输出文件:默认输出到 stdout,用 -o output.mlir 保存到文件。

一、IREE 核心 Dialect Pass

1.1 Flow Dialect(流变换)

Pass功能
--iree-flow-annotate-dispatches注解 dispatch 的执行信息
--iree-flow-canonicalizeFlow 专属的规范化 pass
--iree-flow-capture-dynamic-dims捕获 dispatch 需要的动态维度
--iree-flow-cleanup-tensor-shapes清理残留的 tensor shape 元数据
--iree-flow-deduplicate-executables去重相同的 executable
--iree-flow-dump-dispatch-graph-pass可视化 dump dispatch 图
--iree-flow-export-benchmark-funcs-pass导出 benchmark 函数
--iree-flow-initialize-empty-tensors初始化空 tensor(可 zero-fill)
--iree-flow-inject-dispatch-tracing注入 dispatch trace 标记
--iree-flow-inject-tensor-tracing注入 tensor trace
--iree-flow-insert-debug-target-at-ordinal/symbol在指定位置插入断点/trace
--iree-flow-outline-constants将常量 outline 到 util.global
--iree-flow-outline-dispatch-externs/regions将 dispatch outline 到 executable
--iree-flow-replicate-globals-per-affinity按 affinity 复制全局变量

1.2 Dispatch Creation(Dispatch 区域形成)

Pass功能
--iree-dispatch-creation-annotate-data-tiling-hints添加 data-tiling 提示
--iree-dispatch-creation-bitcast-unsupported-element-types位转换不支持的类型
--iree-dispatch-creation-bubble-up-expand-shapes传播 expand_shape 向上
--iree-dispatch-creation-clone-producers-into-dispatch-regions克隆 producer 到 dispatch
--iree-dispatch-creation-collapse-dimensions折叠 Linalg 维度
--iree-dispatch-creation-convert-dispatch-regions-to-workgroups转换为 workgroup
--iree-dispatch-creation-convert-encoding-to-flow转换 encoding 到 flow
--iree-dispatch-creation-convert-tensor-to-flow转换 tensor 操作到 flow
--iree-dispatch-creation-elementwise-op-fusion逐元素操作融合
--iree-dispatch-creation-fold-reshapes-into-tensor-barriers折叠 reshape 到 barrier
--iree-dispatch-creation-fold-unit-extent-dims折叠单位维度
--iree-dispatch-creation-form-dispatch-regions从 Linalg 形成 dispatch 区域
--iree-dispatch-creation-form-scalar-dispatches形成标量 dispatch
--iree-dispatch-creation-form-split-reduction-dispatches拆分 reduction dispatch
--iree-dispatch-creation-fuse-encoding-ops-into-dispatch-regions-pass融合 encoding 到 producer
--iree-dispatch-creation-fuse-horizontal-contractions水平融合 contraction
--iree-dispatch-creation-fuse-multi-use-elementwise-producer多使用 elementwise 融合
--iree-dispatch-creation-fusion-preprocessing融合前预处理
--iree-dispatch-creation-hoist-encoding-ops提升 encoding 出 dispatch
--iree-dispatch-creation-hoist-uniform-scalar-compute提升均匀标量计算
--iree-dispatch-creation-insert-tensor-barriers插入 tensor barrier 标记
--iree-dispatch-creation-materialize-default-workgroup-count-region规范化 workgroup count
--iree-dispatch-creation-propagate-encodings传播 encoding
--iree-dispatch-creation-remove-tensor-barriers移除 tensor barrier
--iree-dispatch-creation-set-encoding引入 tensor encoding
--iree-dispatch-creation-set-split-reduction-sizes设置拆分 reduction 大小
--iree-dispatch-creation-sink-reshapes下沉 reshape
--iree-dispatch-creation-split-reduction-ops拆分 reduction 维度增加并行
--iree-dispatch-creation-transpose-generic-ops转置 generic op 循环

1.3 Stream Dialect(流/调度)

Pass功能
--iree-stream-annotate-affinities/constant-transient-size/dispatch-arguments/assumptions各类注解调试
--iree-stream-automatic-reference-counting自动引用计数
--iree-stream-clone-to-consumers克隆到 consumer affinity
--iree-stream-conversion从 flow 转换到 stream
--iree-stream-dump-statistics导出 stream 使用统计
--iree-stream-elide-async-copies/timepoints消除冗余拷贝/时间戳
--iree-stream-emplace-allocations/transients放置临时分配
--iree-stream-encode-device/host-tensors编码 tensor 为二进制格式
--iree-stream-fold-uniform-operands折叠统一常量操作数
--iree-stream-fuse-dispatch-bindings融合绑定减少数量
--iree-stream-layout-slices布局 packed slice
--iree-stream-materialize-builtins/copy-on-write/encodings/transient-size-queries物化各种 stream 操作
--iree-stream-pack-constants/dispatch-operands打包常量/操作数
--iree-stream-propagate-timepoints传播时间戳到 consumer
--iree-stream-refine-usage精炼资源使用位
--iree-stream-reuse-allocations复用临时分配
--iree-stream-schedule-allocation/concurrency/execution调度分配/并发/执行
--iree-stream-specialize-dispatches/encodings特化 dispatch/encoding
--iree-stream-split-parameter-encoder拆分参数编码器模块
--iree-stream-sync-initializers同步初始化器
--iree-stream-unify-encoding-for-globals统一全局变量 encoding
--iree-stream-verify-*各类验证 pass

1.4 HAL Dialect(硬件抽象层)

Pass功能
--iree-hal-annotate-target-devices注解设备目标
--iree-hal-assign-legacy-target-devices/target-devices分配 HAL 设备目标
--iree-hal-capture-executable-sources捕获 executable 源码
--iree-hal-configure-executables/target-executable-variants配置 executable
--iree-hal-conversion转换到 HAL dialect
--iree-hal-dump-executable-benchmarks/sources导出 benchmark/源码
--iree-hal-elide-redundant-commands消除冗余命令
--iree-hal-hoist-executable-objects提升 executable 对象
--iree-hal-initialize-devices初始化设备句柄
--iree-hal-inline-conversion/inline-executables内联 HAL executable
--iree-hal-inline-memoize-regions内联 memoize 区域
--iree-hal-link-all-executables/link-target-executables链接 executable
--iree-hal-loader-conversion/materialize-executables/resolve-export-ordinalsLoader 相关
--iree-hal-materialize-dispatch-instrumentation/interfaces/resource-caches/target-devices物化 HAL 资源
--iree-hal-memoize-device-queries/selectionMemoize 设备查询
--iree-hal-outline-memoize-regionsOutline memoize 区域
--iree-hal-preprocess-executables-with-pipeline/tool预处理 executable
--iree-hal-prune-executables裁剪未引用的 variant
--iree-hal-repeat-dispatches重复 dispatch
--iree-hal-resolve-device-aliases/promises/export-ordinals/topology-queries解析各种 HAL 引用
--iree-hal-serialize-all-executables/serialize-target-executables序列化 executable
--iree-hal-strip-executable-contents剥离 executable 内容减小 IR
--iree-hal-substitute-executables替换 executable 为磁盘文件
--iree-hal-translate-all-executables/translate-target-executable-variants翻译 executable
--iree-hal-verify-devices验证设备可达性

1.5 Util Dialect(工具)

Pass功能
--iree-util-annotate-op-ordinals注解全局唯一 ID
--iree-util-apply-patterns应用规范化模式
--iree-util-attribute-call-graph传播属性到调用点
--iree-util-combine-initializers合并全局初始化器
--iree-util-drop-compiler-hints删除无运行时等效的操作
--iree-util-dump-module导出模块 IR
--iree-util-fixed-point-iterator迭代子 pipeline 到不动点
--iree-util-fold-globals折叠重复全局变量
--iree-util-fuse-globals融合相关全局变量
--iree-util-hoist-into-globals提升常量表达式到全局
--iree-util-import-resources导入大数据资源
--iree-util-ipo跨过程优化
--iree-util-lift-cfg-to-scf提升非结构化控制流到 SCF
--iree-util-link-modules链接外部函数模块
--iree-util-optimize-int-arithmetic优化整数算术
--iree-util-propagate-subranges传播资源子范围
--iree-util-simplify-global-accesses简化全局访问
--iree-util-strip-and-splat-constants剥离常量并替换为 splat
--iree-util-strip-debug-ops剥离调试操作
--iree-util-verify-initialization-order/structured-control-flow验证

1.6 VM Dialect(虚拟机)

Pass功能
--iree-vm-annotate-functions注解 yield/unwind 要求
--iree-vm-conversion转换到 VM dialect
--iree-vm-convert-to-yieldable-calls转换可 yield 调用
--iree-vm-deduplicate-rodata去重 rodata
--iree-vm-drop-empty-module-initializers/excluded-exports/optimization-barriers/unused-calls清理无用 VM 操作
--iree-vm-global-initialization创建全局 init/deinit
--iree-vm-hoist-inlined-rodata提升内联 rodata
--iree-vm-materialize-ref-discards插入 ref discard
--iree-vm-ordinal-allocation分配模块唯一序号
--iree-vm-reify-rodata-tables具体化 rodata 表
--iree-vm-resolve-rodata-loads解析 rodata 加载
--iree-vm-sink-defining-ops下沉少用操作到使用点

1.7 I/O Parameters

Pass功能
--iree-io-export-parameters导出全局常量到参数归档
--iree-io-generate-splat-parameter-archive生成 splat 参数归档
--iree-io-import-parameters从归档导入参数

二、IREE Codegen Pass(代码生成)

2.1 Codegen 通用

Pass功能
--iree-codegen-absorb-swizzle-hint-to-alloc吸收 swizzle_hint 到 alloc
--iree-codegen-add-fast-math-flags添加快速数学标志
--iree-codegen-affinemin-scf-canonicalization清理 tiling 后的 affineMinOp
--iree-codegen-block-dynamic-dimensions展开已知倍数动态维度
--iree-codegen-bubble-up-ordinal-ops上冒 ordinal op
--iree-codegen-bufferize-copy-only-dispatchesBufferize 仅拷贝 dispatch
--iree-codegen-bufferize-dispatch-tensor-load-storeBufferize dispatch tensor 边界
--iree-codegen-canonicalizeCodegen 专用规范化
--iree-codegen-canonicalize-scf-forscf.for 循环携带值规范化
--iree-codegen-cleanup-buffer-alloc-view清理 HAL 接口/分配/视图
--iree-codegen-combine-result/source-layout-transformation合并布局变换到 map_store/map_load
--iree-codegen-concretize-pad-result-shape具体化 pad 结果形状
--iree-codegen-config-tracking-canonicalize跟踪 lowering config 的规范化
--iree-codegen-convert-constraints-to-smt转换 SMT 约束
--iree-codegen-convert-hal-descriptor-type-to-gpu-address-spaceHAL 描述符类型转 GPU 地址空间
--iree-codegen-convert-unsupported-float-to-int-buffers不支持的 float 转 int buffer
--iree-codegen-convert-workgroup-forall-to-pcf转换 workgroup forall 到 pcf.loop
--iree-codegen-convolution-to-igemm卷积转 implicit GEMM
--iree-codegen-cpu-lower-to-ukernels/prepare-ukernelsCPU 微内核 lowering
--iree-codegen-cpu-propagate-data-layout传播 pack/unpack/reshape 布局
--iree-codegen-create-dispatch-config/propagate-dispatch-config创建/传播 dispatch config
--iree-codegen-debug-patch-func-ops调试用 func patch
--iree-codegen-decompose-affine-ops分解 affine.apply
--iree-codegen-decompose-boundary-pack-unpack-ops分解边界 pack/unpack
--iree-codegen-decompose-convolution-to-lower-dim-ops卷积分解为低维操作
--iree-codegen-decompose-linalg-generic分解 linalg.generic
--iree-codegen-decompose-memrefs分解 memref
--iree-codegen-decompose-pack-unpack-ops分解 pack/unpack 为可向量化操作
--iree-codegen-decompose-softmax分解 softmax 为 linalg 序列
--iree-codegen-drop-vector-unit-dims丢弃向量单位维度
--iree-codegen-emulate-narrow-type用宽整数模拟窄整数
--iree-codegen-erase-dead-alloc-and-stores删除只有 store 使用的 alloc
--iree-codegen-erase-hal-descriptor-type-from-memref擦除 HAL 描述符类型
--iree-codegen-expand-gpu-ops扩展高级 GPU 操作
--iree-codegen-expand-strided-metadata解析 memref 步长元数据
--iree-codegen-fission-transfer-ops-in-control-flow分裂传输操作支持预取
--iree-codegen-flatten-memref-subspan展平 n-D MemRef subspan
--iree-codegen-flatten-swizzle-hint-allocs展平 swizzle_hint 分配
--iree-codegen-fold-affinemin-in-distributed-loops折叠分布式循环中的 affine.min
--iree-codegen-fold-memref-alias-ops折叠 memref 别名操作
--iree-codegen-fold-reshape-into-interface-tensor折叠 reshape 到接口绑定
--iree-codegen-fold-split-reduction-and-workgroup-mapping-loops折叠拆分 reduction 循环
--iree-codegen-fold-tensor-extract-op折叠 tensor.extract
--iree-codegen-forall-to-for转换 scf.forall 到 scf.for
--iree-codegen-fuse-tensor-pad-with-consumer融合 tensor.pad 到 consumer
--iree-codegen-generic-vectorization通用向量化 pass
--iree-codegen-hoist-inner-tiled-acc-reshapes提升 inner_tiled 周围 reshape
--iree-codegen-hoist-statically-bound-allocations提升静态界限 alloca
--iree-codegen-hoist-vector-extract-insert-slice提升向量提取/插入对
--iree-codegen-inject-assume-alignment注入对齐假设
--iree-codegen-insert-batch-dim-for-batchless-conv为无 batch 卷积插入 batch 维度
--iree-codegen-insert-smt-constraints插入 SMT 约束
--iree-codegen-instrument-memory-accesses仪器化内存访问
--iree-codegen-iree-bufferize-constants/comprehensive-bufferizeBufferize 常量/Linalg
--iree-codegen-link-tuning-specs链接 tuning spec
--iree-codegen-lower-bitcode/memref/tensor-ukernels-to-calls降低微内核
--iree-codegen-lowering-config-interpreter应用 lowering config 策略
--iree-codegen-materialize-device/host-encoding物化 tensor 编码
--iree-codegen-materialize-encoding-into-nop删除编码(nop)
--iree-codegen-materialize-tuning-specs加载 tuning spec
--iree-codegen-materialize-user-configs设置用户 lowering config
--iree-codegen-materialize-vector-masking/tile-sizes物化向量掩码/尺寸
--iree-codegen-math-transform数学函数变换/近似
--iree-codegen-memrefcopy-to-linalgmemref.copy 转 linalg
--iree-codegen-normalize-loop-bounds规范化循环边界
--iree-codegen-optimize-tensor-insert-extract-slices优化 tensor slice 操作
--iree-codegen-optimize-vector-transfer优化向量传输
--iree-codegen-pad-dynamic-alloc动态 alloc 转静态
--iree-codegen-propagate-constant-offsets/dispatch-size-bounds传播常量偏移/工作组边界
--iree-codegen-propagate-reshapes-by-expansion通过展开传播 reshape
--iree-codegen-reconcile-translation-info合并翻译信息
--iree-codegen-reinsert-swizzle-hints重新插入 swizzle_hint
--iree-codegen-rematerialize-parallel-ops重物化并行操作
--iree-codegen-remove-index-hints/single-iteration-loop移除索引提示/单迭代循环
--iree-codegen-reorder-workgroups重排工作组 ID 改善缓存
--iree-codegen-replace-slow-min-max-ops慢速 min/max 替换为快速版本
--iree-codegen-resolve-swizzle-hints/workgroup-count-hints解析 swizzle_hint/工作组计数提示
--iree-codegen-specialize-exports基于注解范围特化导出
--iree-codegen-split-full-partial-transfer拆分向量传输为快/慢路径
--iree-codegen-strip-compilation-info删除所有 lowering config 属性
--iree-codegen-test-*测试用 pass
--iree-codegen-tile-and-distribute-to-workgroups-using-forall-op切分并分发到工作组
--iree-codegen-tile-large-tensors贪婪切分大 tensor
--iree-codegen-type-propagation传播 tensor 类型避免非法 load/store
--iree-codegen-unroll-annotated-loops展开标记的 scf.for 循环
--iree-codegen-vector-reduction-to-gpu向量 reduction 转 GPU
--iree-codegen-vector-transfer-lowering降低传输操作到简单操作
--iree-codegen-vectorize-memref-copy向量化 memref 拷贝
--iree-codegen-vectorize-tensor-pad向量化 tensor.pad
--iree-codegen-verify-smt-constraints/workgroup-distribution验证

2.2 GPU Codegen

Pass功能
--iree-codegen-gpu-alloc-private-memory-for-dps-opsDPS 操作分配私有内存
--iree-codegen-gpu-apply-padding-level/tiling-level按 tiling config 填充/切分
--iree-codegen-gpu-bubble-resource-casts上冒 resource cast
--iree-codegen-gpu-check-resource-usage检查 GPU 资源使用(共享内存限制)
--iree-codegen-gpu-combine-layout-transformation/value-semantic-barriers合并布局变换/barrier
--iree-codegen-gpu-convert-to-coalesced-dma转换为聚合 DMA
--iree-codegen-gpu-create-fast-slow-path创建快/慢路径处理 padding
--iree-codegen-gpu-decompose-horizontally-fused-gemms分解水平融合 GEMM
--iree-codegen-gpu-distribute/distribute-copy-using-forall/distribute-forall/distribute-scf-for/distribute-shared-memory-copy各种 GPU 分发 pass
--iree-codegen-gpu-fuse-and-hoist-parallel-loops融合提升并行循环
--iree-codegen-gpu-fuse-subgroup-consumers融合 subgroup consumer
--iree-codegen-gpu-generalize-named-ops命名 Linalg 转 generic
--iree-codegen-gpu-greedily-distribute-to-threads贪婪分发到线程
--iree-codegen-gpu-infer-memory-space推断 alloc_tensor 内存空间
--iree-codegen-gpu-multi-buffering多缓冲
--iree-codegen-gpu-pack-partial-reductions拆分 reduction 到 [outer, inner]
--iree-codegen-gpu-pack-to-intrinsics打包 matmul 转内在函数
--iree-codegen-gpu-pad-convs/pad-operands填充卷积/操作数
--iree-codegen-gpu-pipelining软件流水线
--iree-codegen-gpu-promote-matmul-operands拷贝 matmul 操作数
--iree-codegen-gpu-reduce-bank-conflicts减少共享内存 bank 冲突
--iree-codegen-gpu-reuse-shared-memory-allocs复用共享内存分配
--iree-codegen-gpu-tensor-alloc/tensor-tile/tile-and-convert-conv-to-matmul/tile-reduction/vector-alloc/verify-distributionGPU tensor 操作
--iree-codegen-gpu-tile切分 Linalg 到 GPU 调用
--iree-codegen-gpu-tensor-tile-to-serial-loopsreduction 维度串行切分
--iree-codegen-gpu-vectorize-pipelineGPU 向量化 pipeline 标志

2.3 LLVMCPU Codegen

Pass功能
--iree-llvmcpu-2d-scalable-to-1d-scalable不支持的可扩展维度转循环
--iree-llvmcpu-assign-constant/import-ordinals分配常量/导入序号
--iree-llvmcpu-check-ir-before-llvm-conversion检查 LLVM 转换前 IR 约束
--iree-llvmcpu-emit-vectorization-remarks发射向量化备注
--iree-llvmcpu-expand-f16-op-to-f32f16 操作展开为 f32
--iree-llvmcpu-link-executables链接 LLVMCPU executable
--iree-llvmcpu-lower-executable-target使用 lowering pipeline 降低 executable
--iree-llvmcpu-mmt4d-vector-lowering向量降低逻辑
--iree-llvmcpu-peel对非分布式循环进行 peeling
--iree-llvmcpu-select-lowering-strategy选择 CPU lowering pipeline
--iree-llvmcpu-split-reduction拆分 reduction
--iree-llvmcpu-synchronize-symbol-visibility同步 LLVM 链接与 MLIR 可见性
--iree-llvmcpu-tile切分 TilingInterface 操作
--iree-llvmcpu-tile-and-fuse-producer-consumer切分根操作并融合 producer/consumer
--iree-llvmcpu-tile-to-vector-size切分到目标向量大小
--iree-llvmcpu-unfuse-fma-pass拆散 llvm.fma
--iree-llvmcpu-vector-contract-custom-kernels启用自定义 vector.contract 内核
--iree-llvmcpu-vector-shape-cast/vector-transpose-lowering向量 shape cast / transpose 降低
--iree-llvmcpu-verify-linalg-transform-legality/vector-size-legality验证
--iree-llvmcpu-virtual-vector-lowering高层向量操作降低

2.4 LLVMGPU Codegen

Pass功能
--iree-llvmgpu-1d-vector-canonicalizations1-D 向量规范化
--iree-llvmgpu-assign-constant-ordinals分配常量序号
--iree-llvmgpu-cast-address-space-function转换调用/函数的地址空间
--iree-llvmgpu-configure-tensor-layouts设置 tensor 布局
--iree-llvmgpu-legalize-nd-vectorsn-D 向量合法化为 1-D
--iree-llvmgpu-link-executables链接 LLVMGPU executable
--iree-llvmgpu-lower-executable-target降低 executable target
--iree-llvmgpu-pack-shared-memory-alloc打包共享内存分配减少使用
--iree-llvmgpu-prefetch-shared-memory预取共享内存流水线
--iree-llvmgpu-select-lowering-strategy选择 GPU lowering pipeline
--iree-llvmgpu-tensorcore-vectorization转换为向量形式用于 GPU MMA
--iree-llvmgpu-tile-and-distribute切分并分发 workgroup 内操作
--iree-llvmgpu-vector-distribute/vector-lowering/vector-to-gpu向量分发/降低/转 GPU

2.5 SPIR-V Codegen

Pass功能
--iree-spirv-annotate-winograd-loops注解 Winograd 最内层循环
--iree-spirv-breakdown-large-vector分解 SPIR-V 不支持的大向量
--iree-spirv-convert-gpu-target转换 iree_gpu.target 到 spirv.target_env
--iree-spirv-emulate-i64用 32-bit 模拟 64-bit 整数
--iree-spirv-erase-storage-buffer-static-shape静态 shape storage buffer 转动态
--iree-spirv-final/initial-vector-lowering向量最终/初始降低
--iree-spirv-link-executables链接 SPIR-V executable
--iree-spirv-lower-executable-target-pass降低 executable target 到 SPIR-V
--iree-spirv-lower-executable-using-transform-dialect使用 transform dialect 降低
--iree-spirv-map-memref-storage-class映射 MemRef 到 SPIR-V 存储类
--iree-spirv-materialize-executable-conditions物化 SPIR-V 目标需求条件
--iree-spirv-select-lowering-strategy-pass选择 SPIR-V lowering 策略
--iree-spirv-tile-and-distribute切分分发 buffer 语义 Linalg
--iree-spirv-tile-and-promote切分提升 Linalg 到 workgroup 内存
--iree-spirv-tile-to-cooperative-ops切分到 subgroup 并向量化
--iree-spirv-trim-executable-target-env裁剪 SPIR-V 目标环境到最小需求
--iree-spirv-vector-to-gpu-subgroup-mma-ops向量转 GPU subgroup MMA
--iree-spirv-vectorize-load-store向量化 memref 加载/存储
--iree-spirv-vectorize-to-cooperative-ops切分并向量化到 cooperative 操作

2.6 VMVX Codegen

Pass功能
--iree-vmvx-assign-constant-ordinals分配常量序号
--iree-vmvx-conversion转换到 VMVX dialect
--iree-vmvx-link-executables链接 VMVX executable
--iree-vmvx-lower-executable-target降低 executable target
--iree-vmvx-lower-linalg-microkernels降低 linalg 到 VMVX 微内核
--iree-vmvx-materialize-constants物化可执行常量
--iree-vmvx-resolve-buffer-descriptors解析 buffer 描述符
--iree-vmvx-select-lowering-strategy选择 lowering 策略

2.7 ROCm/AMDGPU Codegen

Pass功能
--iree-rocdl-annotate-kernel-for-translation翻译前设置函数属性
--iree-rocdl-buffer-instructions-optimizationbuffer 指针优化
--iree-rocdl-configure-buffer-instructions确定 buffer 指针子跨度
--iree-rocdl-load-to-transpose-load向量化读取转 transpose_load
--iree-codegen-amdgpu-lower-coalesced-dma-to-gather-ldsDMA 降低到 gather_to_lds

三、IREE 全局优化 Pass

Pass功能
--iree-global-opt-cleanup-numeric-narrowing清理数值收窄
--iree-global-opt-convert-conv2d-to-img2col卷积转 img2col + matmul
--iree-global-opt-convert-strided-contraction-to-contraction从步长 contraction 提取 slice
--iree-global-opt-data-layout-propagation传播 pack/unpack 改善融合
--iree-global-opt-decompose-concat分解 concatenation
--iree-global-opt-demote-contraction-inputscontraction 输入降级到窄类型(f32→f16/bf16)
--iree-global-opt-detach-elementwise-from-named-ops从命名 Linalg 分离 elementwise
--iree-global-opt-erase-unused-linalg-operands删除未使用 linalg 操作数
--iree-global-opt-expand-tensor-shapes展开 tensor shape 维度为 SSA
--iree-global-opt-fuse-dequantization-matmul融合反量化和 matmul
--iree-global-opt-generalize-linalg-named-opsLinalg 命名操作转 generic
--iree-global-opt-infer-numeric-narrowing推断并插入数值收窄注解
--iree-global-opt-loop-invariant-code-motion循环不变代码外提
--iree-global-opt-materialize-homogeneous-encodings单目标时物化物理 encoding
--iree-global-opt-optimize-numerics基于注解优化数值
--iree-global-opt-propagate-linalg-transpose传播 linalg.transpose
--iree-global-opt-quantized-conv-to-conv/matmul-to-matmul量化 op 降低
--iree-global-opt-raise-special-ops提升 softmax 等为高层 linalg.ext
--iree-global-opt-remove-zero-extent-tensors删除零宽度 tensor
--iree-global-opt-simplify-pack-unpack简化 pack/unpack
--iree-global-opt-warn-on-uninitialized-values警告未初始化值使用

四、IREE 预处理 Pass

Pass功能
--iree-preprocessing-apply-pdl-patterns应用 PDL 模式
--iree-preprocessing-attr-based-pipeline运行属性指定的 pipeline
--iree-preprocessing-convert-1x1-filter-conv2d-to-matmul1x1 卷积转 matmul
--iree-preprocessing-convert-conv-filter/channels-last卷积滤镜/通道布局转换
--iree-preprocessing-convert-strided-insert-slice-to-generic转换 strided insert_slice
--iree-preprocessing-fold-attention-with-transpose折叠 attention + transpose
--iree-preprocessing-generalize-linalg-matmul-experimentalmatmul 转 generic(实验)
--iree-preprocessing-make-single-dispatch-for-function整个函数合并为单个 dispatch
--iree-preprocessing-pad-linalg-ops按指定大小填充 linalg
--iree-preprocessing-pad-to-intrinsics填充以匹配目标内在函数
--iree-preprocessing-swap-strided-insert-slice-with-contraction交换 1x1 反向卷积操作顺序
--iree-preprocessing-transform-interpretertransform dialect 解释器
--iree-preprocessing-transpose-matmul-pass转置 matmul

五、IREE 输入转换 Pass(前端)

5.1 StableHLO 输入

Pass功能
--iree-stablehlo-canonicalize规范化 StableHLO 操作
--iree-stablehlo-legalize-control-flow控制流转 SCF
--iree-stablehlo-legalize-custom-calls特化 custom calls 分解
--iree-stablehlo-legalize-shape-computationsshape 操作转 core-mlir
--iree-stablehlo-preprocessing-*各种预处理(dot-general、einsum、gather、complex、batch-norm、tuple flattening)
--iree-stablehlo-to-iree-inputStableHLO 转 IREE 输入 dialect
--iree-stablehlo-to-linalg-extStableHLO 转 LinalgExt
--iree-stablehlo-to-stablehlo-preprocessingIREE 专属 StableHLO 预处理
--iree-stablehlo-verify-compiler-input-legality验证编译器输入合法性

5.2 Torch 输入

Pass功能
--torch-adjust-calling-conventions调整调用约定
--torch-convert-custom-quant-op自定义量化操作转换
--torch-decompose-complex-ops分解复杂 torch 操作
--torch-drop-abstract-interp-calculations删除抽象解释计算
--torch-erase-module-initializer擦除模块初始化器
--torch-finalizing/backend-type-conversion完成 builtin tensor 转换
--torch-fuse-quantized-opsQDQ 序列融合
--torch-globalize-object-graph对象图全局化
--torch-inline-global-slots内联 global_slot
--torch-iree-*Torch→IREE 专属转换
--torch-lower-to-backend-contract简化到后端约定
--torch-match-quantized-custom-ops匹配量化操作
--torch-maximize-value-semantics尽可能使用 value-semantic tensor
--torch-recompose/reduce/refine/reify/simplify/*各种 Torch IR 变换
--torch-to-ireeTorch→IREE 完整 pipeline
--torch-verify-backend-contract-*验证后端约定

5.3 TOSA 输入

Pass功能
--iree-tosa-convert-i48-to-i64i48 转 i64
--iree-tosa-strip-signedness去除有符号性
--iree-tosa-to-linalg-extTOSA 转 linalg-ext
--iree-tosa-verify-compiler-input-legality验证编译器输入
--tosa-to-arith/linalg/tensorTOSA 标准降低 pass

5.4 其他输入

Pass功能
--iree-import-ml-programMLProgram 转 IREE 等价物
--iree-import-publicIREE public dialect 转 internal
--iree-simpleio-legalize合法化 simpleio 示例操作
--iree-tflite-wrap-entry-pointsTFLite C 绑定包装
--convert-torch-conversion-to-mlprogramTorchConversion 转 MLProgram
--convert-torch-onnx-to-torchONNX 自定义操作转 native torch
--convert-torch-to-arith/linalg/scf/tensor/tmtensorTorch 操作转标准 dialect
--chlo-legalize-to-stablehloCHLO 转 StableHLO
--iree-convert-bf16-arith-to-f32bf16 算术转 f32
--iree-convert-unsupported-float-arith模拟不支持的浮点类型(fp8)
--iree-convert-accgemm-to-gemm累积 GEMM 转 GEMM

六、IREE 终 lowering Pass(到 LLVM/VM)

Pass功能
--iree-convert-to-llvmLinalg/HAL/Shape/Vector/Standard → LLVMIR
--iree-convert-to-nvvmbuiltin/GPU/HAL → LLVM + NVVM
--iree-convert-to-rocdlbuiltin/GPU/HAL → LLVM + ROCDL
--iree-convert-to-spirv最终转换到 SPIR-V dialect
--iree-convert-vm-to-emitcVM 操作转 EmitC
--iree-top-level-scf-to-cfg顶层 SCF 转 CFG

七、IREE 扩展 Dialect Pass

7.1 iree_linalg_ext

Pass功能
--iree-linalg-ext-convert-attention-to-online-attentionattention 转 online_attention
--iree-linalg-ext-convert-conv-to-im2col-op/conv2d-to-winograd卷积转 im2gemm/Winograd
--iree-linalg-ext-decompose-aggregated-ops/attention/im2col/map_store/winograd各种分解 pass
--iree-linalg-ext-fold-unit-extent-dims折叠单位维度
--iree-linalg-ext-test-reshape-fusion测试 reshape 融合
--iree-linalg-ext-to-loopsLinalgExt 操作转循环
--iree-linalg-ext-topk-split-reductionTopk 拆分 reduction
--iree-linalg-pad-contraction-to-block-sizecontraction 按块大小填充

7.2 iree_gpu

Pass功能
--iree-gpu-convert-forall-to-generic-nestforall 转 pcf.generic
--iree-gpu-distribute-inner-tiled-to-lanesinner_tiled 分发到 lane
--iree-gpu-expand-undistributed-inner-tiles展开 inner_tiled 内部维度
--iree-gpu-lower-opsbufferize 后 iree_gpu 降低
--iree-gpu-unroll-to-intrinsics展开 multi_mma 到内部向量大小

7.3 iree_pcf(并行控制流)

Pass功能
--iree-pcf-convert-sref-to-memrefpcf.sref 转 memref
--iree-pcf-fuse-consumers/pcf-writes/producers融合 pcf 操作
--iree-pcf-lower-structural-pcfpcf 转 scf
--iree-pcf-resolve-tokens解析 pcf.sref 同步

7.4 iree_vector_ext

Pass功能
--iree-vector-ext-fold-unit-extent-dims折叠单位维度
--iree-vector-ext-lower-transfer-gather-scatter-to-vectortransfer_gather/scatter 转 vector

7.5 iree_tensor_ext

Pass功能
--iree-eliminate-empty-tensors消除 tensor.empty 避免 buffer 分配
--iree-tensor-ext-test-sparse-op-interface-methods测试稀疏操作接口

八、MLIR Upstream Pass

8.1 Affine Dialect

Pass功能
--affine-data-copy-generate生成显式 affine 内存拷贝
--affine-expand-index-opsaffine index 操作降低
--affine-fold-memref-alias-ops折叠 memref 别名
--affine-loop-coalescing嵌套循环合并为单循环
--affine-loop-fusionaffine 循环融合
--affine-loop-invariant-code-motion循环不变代码外提
--affine-loop-normalize仿射循环规范化
--affine-loop-tile仿射循环切分
--affine-loop-unroll仿射循环展开
--affine-loop-unroll-jam仿射循环 unroll-and-jam
--affine-parallelizefor 转 parallel
--affine-pipeline-data-transfer流水线化数据传输
--affine-raise-from-memrefmemref 操作提升为 affine
--affine-scalrep标量替换 affine 访存
--affine-simplify-min/max简化 min/max/apply
--affine-simplify-structures简化仿射表达式
--affine-simplify-with-bounds利用值界简化索引
--affine-super-vectorize向量化到目标无关 n-D 抽象

8.2 Bufferization

Pass功能
--one-shot-bufferize一次性 bufferize
--buffer-deallocation-simplification优化 dealloc 操作
--buffer-hoisting分配操作提升到公共支配点
--buffer-loop-hoisting分配操作提出循环
--buffer-results-to-out-paramsmemref 返回值转 out-params
--bufferization-lower-deallocationsbufferization.dealloc 转 memref.dealloc
--ownership-based-buffer-deallocation基于所有权的 buffer 释放
--promote-buffers-to-stack堆分配提升到栈分配
--optimize-allocation-liveness优化临时分配活性

8.3 Linalg Dialect

Pass功能
--linalg-block-pack-matmulmatmul 分块布局转换
--linalg-fold-into-elementwise将 transpose/broadcast 折叠到 elementwise
--linalg-fold-unit-extent-dims移除单位维度
--linalg-fuse-elementwise-opselementwise 操作融合
--linalg-generalize-named-ops命名操作转 generic
--linalg-inline-scalar-operands内联标量操作数
--linalg-morph-opslinalg 操作形态转换
--linalg-specialize-generic-opsgeneric 转回命名操作
--convert-linalg-to-affine-loopsLinalg 转仿射循环
--convert-linalg-to-loopsLinalg 转循环
--convert-linalg-to-parallel-loopsLinalg 转并行循环
--convert-elementwise-to-linalgElementwiseMappable 转 linalg

8.4 Vector Dialect

Vector 相关 pass 主要整合在 iree-codegen 中。

8.5 GPU Dialect

Pass功能
--gpu-async-regionGPU 操作异步化
--gpu-decompose-memrefs分解 memref 索引计算
--gpu-eliminate-barriers删除不必要 barrier
--gpu-kernel-outliningoutlining gpu.launch body
--gpu-launch-sink-index-computations下沉索引计算到 gpu.launch
--gpu-map-parallel-loops映射循环到 GPU 硬件维度
--gpu-module-to-binaryGPU 模块转二进制

8.6 SCF / CF / Control Flow

Pass功能
--convert-scf-to-cfSCF 转 ControlFlow
--scf-parallel-loop-fusion相邻并行循环融合
--scf-parallel-loop-tiling并行循环切分
--loop-invariant-code-motion循环不变代码外提

8.7 MemRef Dialect

Pass功能
--memref-elide-reinterpret-cast消除冗余 reinterpret_cast
--memref-emulate-wide-int用 N-bit 模拟 2N-bit 整数
--memref-expandmemref 操作合法化到 LLVM
--normalize-memrefs规范化 memref
--flatten-memref多维 memref 展平到 1-D
--fold-memref-alias-ops折叠 memref 别名到 load/store
--expand-reallocrealloc 展开为组件
--expand-strided-metadata展开 strided metadata
--drop-equivalent-buffer-results删除等价于 bbArg 的返回值

8.8 Transform Dialect

Pass功能
--transform-dialect-check-uses检查潜在 use-after-free
--transform-dialect-drop-schedule删除 schedule
--transform-infer-effects推断 transform 副作用
--transform-interpretertransform dialect 解释器
--transform-preload-library预加载 transform 库
--iree-transform-dialect-interpreterIREE 版 transform 解释器

8.9 其他 MLIR Upstream

Pass功能
--canonicalize操作规范化
--cse公共子表达式消除
--inline函数内联
--symbol-dce消除死符号
--strip-debuginfo剥离调试信息
--lower-affineAffine 转 Arith + SCF
--shape-to-shape-loweringShape 转 Arith
--resolve-ranked-shaped-type-result-dims解析 ranked shape 结果维度
--reconcile-unrealized-casts简化未实现转换 casts
--reify-result-shapes具体化 PadOp/ConcatOp 结果
--snapshot-op-locations从当前 IR 生成新位置信息
--print-op-stats打印操作统计
--view-op-graph打印 Graphviz 可视化
--outline-shape-computation用 shape.func 保存形状计算

九、Target Attach 和 Backend Pass

Pass功能
--nvvm-attach-target附加 NVVM 目标属性到 GPU Module
--rocdl-attach-target附加 ROCDL 目标属性到 GPU Module
--spirv-attach-target附加 SPIR-V 目标属性到 GPU Module
--xevm-attach-target附加 XeVM 目标属性到 GPU Module

十、调试 / 测试 / 分析 Pass

Pass功能
--test-arm-sme-tile-allocation测试 SME tile 分配
--test-iree-vm-live-intervals测试活跃区间分析
--test-iree-vm-register-allocation测试寄存器分配
--test-iree-vm-value-liveness测试值活性分析
--iree-test-llvmgpu-legalize-ops测试合法化模式
--iree-codegen-test-*Codegen 各类测试 pass
--iree-pcf-test-*PCF 测试 pass
--iree-util-test-*Util 测试 pass(转换、浮点范围、整数整除性分析)

十一、LLVM 后端 Pass

来自 LLVM 基础设施的大量优化选项,包括:

  • Cost model: --cost-kind, --intrinsic-cost-strategy
  • Inlining: --inlining-threshold, --max-iterations
  • InstCombine: --instcombine-* 系列
  • GVN: --enable-gvn-hoist/sink/memoryssa
  • Loop 优化: 循环向量化、展开、交织、尾折叠
  • Profile/PGO: --pgo-*, --sample-profile-*, --instrprof-*
  • LTO/ThinLTO: --lto-embed-bitcode, --thinlto-assume-merged
  • 代码发射: NEON 风格、Arm 属性、x86 分支对齐、RISC-V 属性
  • 安全: --bounds-checking-single-trap, --hwasan-*

十二、Pass Pipelines(Pipeline 总览)

12.1 全局 Pipeline

Pipeline功能
--iree-transformation-pipelineIREE 输入→VM 完整变换流程
--iree-common-input-transformation-pipeline公共输入变换 pipeline
--iree-vm-transformation-pipelineVM dialect 完整变换

12.2 输入 Pipeline

Pipeline功能
--iree-stablehlo-input-transformation-pipelineStableHLO 输入变换
--iree-tosa-input-transformation-pipelineTOSA 输入变换
--torch-to-ireeTorch→IREE pipeline
--torch-function-to-torch-backend-pipelineTorch 函数到后端
--torch-backend-to-linalg-on-tensors-backend-pipelineTorch 后端到 linalg
--torch-simplification-pipelineTorch 简化
--torch-shape-refinement-pipelineTorch 形状精炼
--torch-onnx-to-torch-backend-pipelineONNX→Torch 后端
--torchdynamo-export-to-torch-backend-pipelineTorchDynamo→Torch 后端
--torchscript-module-to-torch-backend-pipelineTorchScript→Torch 后端
--iree-tflite-transform-pipelineTFLite 绑定支持
--iree-abi-transformation-pipelineIREE native ABI 绑定

12.3 Flow / Dispatch Pipeline

Pipeline功能
--iree-flow-transformation-pipelineFlow dialect 完整变换
--iree-dispatch-creation-pipeline形成 dispatch 区域
--iree-dispatch-creation-preprocessing-pipelineDispatch 前预处理

12.4 全局优化 Pipeline

Pipeline功能
--iree-global-optimization-transformation-pipeline全局优化变换
--iree-global-optimization-hoist-constant-expressions提升常量表达式

12.5 HAL Pipeline

Pipeline功能
--iree-hal-transformation-pipelineHAL 完整转换/降低
--iree-hal-configuration-pipelineHAL 目标配置
--iree-hal-device-assignment-pipelineHAL 设备分配
--iree-hal-inline-static/dynamic-transformation-pipelineInline HAL 变换

12.6 Stream Pipeline

Pipeline功能
--iree-stream-transformation-pipelineStream 完整变换
--iree-stream-tensor-transformation-pipelinesource→stream.tensor
--iree-stream-async-transformation-pipelinestream.tensor→stream.async
--iree-stream-cmd-transformation-pipelinestream.async→stream.cmd
--iree-stream-cleanup-pipelineStream 阶段间清理
--iree-stream-optimization-pipelineStream 命令优化

12.7 Codegen Pipeline

Pipeline功能
--iree-codegen-configuration-preprocessing-pipelineCodegen 配置前预处理
--iree-codegen-translation-postprocessing-pipelineCodegen 翻译后处理

LLVMCPU Pipeline

Pipeline功能
--iree-codegen-llvmcpu-configuration-pipelineCPU lowering 策略配置
--iree-codegen-llvmcpu-lowering-pipelineLLVMCPU 降低流程
--iree-codegen-llvmcpu-bufferization-pipelineCPU bufferization
--iree-codegen-llvmcpu-vector-lowering-pipelineCPU 向量降低
--iree-codegen-llvmcpu-linking-pipelineLLVMCPU executable 链接

LLVMGPU Pipeline

Pipeline功能
--iree-codegen-llvmgpu-configuration-pipelineGPU lowering 策略配置
--iree-codegen-llvmgpu-bufferization-pipelineGPU bufferization
--iree-codegen-llvmgpu-linking-pipelineLLVMGPU executable 链接
--iree-codegen-llvmgpu-nvvm-lowering-pipelineNVVM 降低流程
--iree-codegen-llvmgpu-rocdl-lowering-pipelineROCDL 降低流程
--iree-codegen-lower-to-rocm-gpuLinalg→ROCDL 降低

SPIR-V Pipeline

Pipeline功能
--iree-codegen-spirv-configuration-pipelineSPIR-V lowering 配置
--iree-codegen-linalg-to-spirv-pipelineLinalg→SPIR-V 渐进降低

VMVX Pipeline

Pipeline功能
--iree-codegen-vmvx-configuration-pipelineVMVX 配置
--iree-codegen-vmvx-linking-pipelineVMVX executable 链接
--iree-codegen-vmvx-lowering-pipelineVMVX 降低
--iree-vmvx-transformation-pipelineVMVX 完整变换

12.8 预处理 Pipeline

Pipeline功能
--iree-preprocessing-backward-data-conv-pipeline反向数据卷积
--iree-preprocessing-make-single-dispatch单 dispatch 化
--iree-preprocessing-transpose-convolution-pipeline卷积转置规范化

十三、MLIR/编译器通用选项

打印/调试

选项功能
--mlir-print-ir-before/after[-all]打印 pass 前/后的 IR
--mlir-print-ir-before/after=<pass>打印特定 pass 前后的 IR
--mlir-print-ir-after-change/failure仅在变更/失败时打印
--mlir-print-ir-module-scope总是打印顶层模块
--mlir-pass-statistics显示每个 pass 的统计
--mlir-pass-statistics-display=list/pipeline统计显示方式
--mlir-timing显示执行时间
--mlir-timing-display=list/tree时间显示方式
--mlir-diagnostic-verbosity-level诊断信息详细程度
--mlir-print-op-on-diagnostic诊断时附带打印操作
--mlir-print-stacktrace-on-diagnostic诊断时附带堆栈
--mlir-print-debuginfo/pretty-debuginfo打印调试信息
--mlir-disable-threading禁用多线程
--mlir-pass-pipeline-crash-reproducer崩溃时生成复现器
--mlir-generate-reproducer生成复现器
--verify-each每个变换 pass 后运行验证器
--verify-region-info验证区域信息
--verify-diagnostics验证诊断匹配
--verify-roundtrip解析后往返验证
--dump-pass-pipeline打印将运行的 pipeline
--list-passes打印已注册 pass 列表
--show-dialects打印已注册 dialect 列表

Pass 执行控制

选项功能
--pass-pipeline=<string>指定运行的 pass pipeline 描述
--split-input-file分割输入文件分批处理
--verify-each每个 pass 后验证

目标/后端配置

选项功能
--iree-hal-target-backends目标后端
--iree-hal-target-device目标设备规格
--iree-hal-executable-debug-level可执行调试级别 (0-3)
--iree-hal-dump-executable-*导出可执行源码/中间产物/二进制
--iree-llvmcpu-target-triple/CPU/ABI/featuresLLVMCPU 目标配置
--iree-llvmcpu-sanitize=address/threadLLVM 安全检测
--iree-llvmcpu-loop-interleaving/unrolling/vectorization/slpLLVM 循环优化
--iree-vm-target-extension-f32/f64VM 浮点扩展支持
--iree-vm-target-index-bitsVM index 位宽
--iree-opt-level全局优化级别

十四、如何追踪 Pass 执行顺序

想逐个阅读 pass 了解其在干什么,有以下几种方法:

方法一:命令行打印 IR 变化(推荐入门用)

用 --mlir-print-ir-before-all 和 --mlir-print-ir-after-all 可以看到每个 pass 前后的 IR 变化:

# 查看每个 pass 前后的 IR(输出量很大)
iree-opt input.mlir \
  --iree-transformation-pipeline \
  --mlir-print-ir-before-all \
  --mlir-print-ir-after-all \
  --mlir-print-ir-after-change 2>&1 | less

# 只看某个特定 pass 前后的 IR
iree-opt input.mlir \
  --iree-transformation-pipeline \
  --mlir-print-ir-before=canonicalize \
  --mlir-print-ir-after=canonicalize 2>&1 | less

# 打印 pass 统计信息(了解每个 pass 做了多少事)
iree-opt input.mlir \
  --iree-transformation-pipeline \
  --mlir-pass-statistics 2>&1

# 打印 pass 执行时间
iree-opt input.mlir \
  --iree-transformation-pipeline \
  --mlir-timing 2>&1

输出中每个 pass 前会打印 // *** IR Dump Before <pass-name> ***,你可以按此关键字浏览。

方法二:使用 --dump-pass-pipeline 预览完整 pipeline

# 打印 iree-transformation-pipeline 包含的所有 pass
iree-opt --dump-pass-pipeline --pass-pipeline="builtin.module(iree-transformation-pipeline)" 2>&1

# 打印某个子 pipeline 的 pass
iree-opt --dump-pass-pipeline --pass-pipeline="builtin.module(iree-flow-transformation-pipeline)" 2>&1

这会输出 pipeline 中每个 pass 的名称和参数,但不会显示 IR 内容。

方法三:阅读源码中的 Pipeline 定义(最权威)

IREE 的完整 pass 执行顺序定义在源码中。核心文件:

主 pipeline 入口: compiler/src/iree/compiler/Pipelines/Pipelines.cpp

从源码可看到 pass 的执行顺序(phase)为:

Input → ABI → Preprocessing → GlobalOptimization
  → DispatchCreation → Flow → Stream
    → HAL → VM

每个 phase 内部又调用各自的 build pipeline 函数:

Phase构建函数源码位置
InputInputConversion::buildCommonInputConversionPassPipelinecompiler/src/iree/compiler/InputConversion/Common/
PreprocessingPreprocessing::buildPreprocessingPassPipelinecompiler/src/iree/compiler/Preprocessing/
GlobalOptimizationGlobalOptimization::buildGlobalOptimizationPassPipelinecompiler/src/iree/compiler/GlobalOptimization/
DispatchCreationDispatchCreation::buildDispatchCreationPassPipelinecompiler/src/iree/compiler/DispatchCreation/
FlowIREE::Flow::buildFlowTransformPassPipelinecompiler/src/iree/compiler/Dialect/Flow/Transforms/
StreamIREE::Stream::buildStreamTransformPassPipelinecompiler/src/iree/compiler/Dialect/Stream/Transforms/
HALIREE::HAL::buildHALTransformPassPipelinecompiler/src/iree/compiler/Dialect/HAL/Transforms/
VMIREE::VM::buildVMTransformPassPipelinecompiler/src/iree/compiler/Dialect/VM/Transforms/

逐步追踪建议:

  1. 从 Pipelines.cpp 的 buildIREEVMTransformPassPipeline 函数入手,了解整体顺序
  2. 进入感兴趣的 phase(如 Flow),找到对应的 buildFlowTransformPassPipeline
  3. 阅读该函数中逐个添加的 pass,理解每个 pass 的输入/输出 IR 形态

方法四:结合使用——逐个 pass 学习工作流

# 1. 先用 --dump-pass-pipeline 列出所有 pass
iree-opt --dump-pass-pipeline --pass-pipeline="builtin.module(iree-flow-transformation-pipeline)" 2>&1 > passes_list.txt

# 2. 准备一个简单的测试 IR(如一个 matmul)
# test.mlir

# 3. 对每个 pass,单独查看其前后的 IR 变化
iree-opt test.mlir --pass-pipeline="builtin.module(iree-flow-transformation-pipeline)" \
  --mlir-print-ir-before-all --mlir-print-ir-after-all 2>&1 | \
  grep -A 100 "IR Dump Before canonicalize"

# 4. 用 --verify-each 确保每个 pass 后 IR 仍然合法
iree-opt test.mlir --pass-pipeline="builtin.module(iree-flow-transformation-pipeline)" \
  --verify-each --mlir-print-ir-after-all 2>&1

学习建议

  1. 从高层开始:先理解 Input → Flow → Dispatch → Stream → HAL → VM 每个阶段的职责
  2. 选一个简单 pipeline:如 iree-vm-transformation-pipeline,pass 较少,容易理解
  3. 准备小 IR:用极简的 .mlir 文件(几行到几十行),避免输出爆炸
  4. 逐个 pass 看:用 --mlir-print-ir-before=xxx --mlir-print-ir-after=xxx 聚焦单个 pass
  5. 读源码确认:对看不懂的 pass,到对应 Transforms/ 目录找 Passes.cpp 看具体实现