LLVM MLIR的Pass流水线怎么指定执行顺序

雨杰吖_5568

雨杰吖_5568

2026-10-01

835人浏览

原创

pass添加顺序即执行顺序,因passmanager用std::vector存储并按插入序遍历;无隐式调度,须显式控制,如canonicalize必须在cse前,nest仅限作用域不改序。

llvm mlir的pass流水线怎么指定执行顺序

Pass 添加顺序直接决定执行顺序

MLIR 的 Pass 流水线没有隐式调度逻辑,passManager.addPass() 的调用顺序就是实际执行顺序。这不是“建议”,而是底层实现决定的:PassManager 内部维护一个 std::vector<:unique_ptr>></:unique_ptr>,遍历时严格按插入顺序执行。

常见错误是误以为可以通过 Pass 名称、类型或依赖声明自动排序——MLIR 不提供类似 GCC 的 pass 插槽(如 “early-opt”、“late-opt”)机制,也没有全局拓扑排序。所有顺序控制必须显式编码在 C++ 构建逻辑里。

  • 多个 Pass 作用于同一层级(比如都注册在 func::FuncOp 上),它们之间无隐式依赖,谁先加谁先跑
  • 若某 Pass 生成的 IR 是另一个 Pass 的输入前提(例如先 Canonicalizer 再 CSE),就必须手动保证前者在后者之前添加
  • 跨层级 Pass(如 Module 级 Pass 和 Func 级 Pass)也遵循同样规则;Module 级 Pass 先执行完,才会递归进入其子 Region 调用 Func 级 Pass

如何在 iree-opt / mlir-opt 中复现特定顺序

命令行工具通过 -p 或 --passes 指定流水线,参数值是逗号分隔的 Pass 名字符串,顺序即执行顺序。例如:

iree-opt -p="canonicalize,cse,iree-stream-convert-to-stream" input.mlir

这等价于在 C++ 中依次调用:

passManager.addPass(mlir::createCanonicalizerPass());<br>passManager.addPass(mlir::createCSEPass());<br>passManager.addPass(IREE::Stream::createConvertToStreamPass());

注意:iree-opt 和 mlir-opt 的内置 Pass 名不一定完全一致(如 iree-stream-convert-to-stream 是 IREE 自定义 Pass,而 canonicalize 是 MLIR 标准 Pass),具体名称需查对应 dialect 的 registerPasses() 实现或文档。

  • 不支持在命令行中嵌套层级(如 “func.func(cse)”),只能靠 Pass 自身的 nest 行为控制作用域
  • 若某个 Pass 需要配置参数(如 canonicalize 的 maxIterations),命令行需用冒号语法:canonicalize:max-iterations=3
  • 调试时可用 --print-ir-before-all 或 --print-ir-after=<code>pass-name 观察每步输出,验证顺序是否符合预期

嵌套 Pass(nest)和作用域控制的实际影响

nest<:funcop>()</:funcop> 这类调用不是“改变顺序”,而是限定作用域:它把后续添加的 Pass 包裹进一个作用域节点,使它们只对 func::FuncOp 及其子树生效。该嵌套节点本身在流水线中仍占一个位置,且其内部 Pass 按添加顺序执行。

免费语音克隆
免费语音克隆

一款提供AI语音克隆和文本转语音能力的在线工具,可根据声音样本生成具有相似音色特征的语音内容。

下载

例如这段 C++ 代码:

passManager.addPass(createCanonicalizerPass());<br>passManager.nest<:funcop>().addPass(createCSEPass());<br>passManager.addPass(createSymbolDCEPass());</:funcop>

执行顺序是:1. 全局 canonicalize → 2. 进入每个 func::FuncOp 并在其内部运行 cse → 3. 全局 symbol-dce。其中第 2 步的 cse 不会作用于 module-level 的 global op,也不会被提前到第 1 步之前。

  • nest 不改变外层顺序,只插入一个“作用域容器”,容器内 Pass 仍受自身添加顺序约束
  • 同一个 nest<t>()</t> 块里可以添加多个 Pass,它们之间仍按添加顺序执行
  • 不要试图用多层 nest 来模拟条件分支——MLIR PassManager 不支持运行时跳过某段流水线;需要条件逻辑,得在 Pass 内部判断,或由上层构建器动态拼接 passManager

容易被忽略的隐式顺序依赖点

有些 Pass 看似独立,实则强依赖前序 Pass 的副作用。最典型的是 SymbolDCEPass:它只删未被 symbol_table::lookup 引用的符号,但如果前面没运行 canonicalize 或 inline,很多本可被消除的引用仍残留,导致 DCE 失效。

另一个易错点是 Verify*Pass:它们不改 IR,但失败时直接 abort。如果放在流水线中间(如 canonicalize 后、cse 前),就能卡住非法 IR;但如果放最后,可能掩盖前面 Pass 引入的问题。

  • IREE 中的 VerifyInitializationOrderPass 必须在所有初始化相关 Pass(如 FuseGlobals)之前,否则校验必然失败
  • ApplyPatterns 类 Pass(如 OptimizeIntArithmetic)通常需在 canonicalize 之后,否则模式匹配成功率低
  • 自定义 Pass 若读取了 Operation::getAttr("some_key"),要确认前面已有 Pass 写入该属性,否则空指针或断言失败

顺序不是写完就完的事,得结合 IR 形态变化和 Pass 的契约来推演——多数崩溃或结果异常,根源不在 Pass 本身,而在它前面缺了一个该有的 canonicalize 或 symbol-dce。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

0

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

0

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

0

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

0

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

0

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

220

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

120

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

100

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

60

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程