LLVM MLIR怎么用RewritePattern重写操作

落芳大大_8102

落芳大大_8102

2026-10-01

617人浏览

原创

合法oprewritepattern需满足三条件:操作设hascanonicalizer=1、模式注册到getcanonicalizationpatterns、matchandrewrite中调用rewriter.replaceop;模板参数须为具体op类型,benefit值控制优先级,返回logicalresult,严防blockargument解引用、ssa破坏、类型不匹配及插入点错误。

llvm mlir怎么用rewritepattern重写操作

直接用 OpRewritePattern 重写操作是 MLIR 中最常用、最可控的方式,但必须满足三个硬性条件:操作得有 hasCanonicalizer = 1、模式得注册进 getCanonicalizationPatterns、且 matchAndRewrite 里不能漏掉 rewriter.replaceOp 或等效调用。

怎么写一个合法的 OpRewritePattern 子类

核心不是“能编译”,而是让 MLIR 的 Canonicalizer 能识别并触发它。以消除双重转置为例:

  • OpRewritePattern 模板参数必须是具体操作类型(如 TransposeOp),不能是基类或 Operation*
  • 构造函数里传入 benefit 值(整数),值越大越优先匹配;通常设为 1 就够用,除非你有多个冲突模式
  • matchAndRewrite 必须返回 LogicalResult:成功用 success(),失败用 failure(),不能只写逻辑不返值
  • 匹配时别直接用 getDefiningOp<someop>()</someop> 判空后就往下走——如果返回 nullptr,getOperand() 可能是 block argument,这时再取 .getDefiningOp 会 crash

matchAndRewrite 里最容易崩的几处

这个函数看着简单,实操中 70% 的 segfault 或 IR 验证失败都出在这里:

造次
造次

一款AI视频创作工具,主要用于Liblib打造的AI原创IP视频创作社区,适合需要提升相关任务效率的用户。

下载
  • 没检查 operand 是否为 BlockArgument:比如 op.getOperand().isa<blockargument>()</blockargument> 为真时,.getDefiningOp<...>()</...> 返回 nullptr,后续解引用直接挂
  • 替换时用了错误的重写器接口:想删掉整个 op 并替换成一个值,必须用 rewriter.replaceOp(op, {new_value});若误用 rewriter.eraseOp(op) + 手动插入新 op,会破坏 SSA 使用链,IR 验证通不过
  • 新值的类型没对齐:比如原 op 输出是 tensor,你 replace 成一个 tensor,类型不兼容,replaceOp 会静默失败(返回 failure())但不报错
  • 在 pattern 里调用了 rewriter.create<...>()</...> 却没设好插入点:默认插入点可能在 module 顶层,导致新 op 不在合法 region 内;应先用 rewriter.setInsertionPoint(op) 或 rewriter.setInsertionPointAfter(op)

怎么让 Canonicalizer 真正跑起来

写了 pattern 不等于它会被调用。MLIR 不会自动扫描所有 OpRewritePattern 子类:

  • 必须在对应操作的 getCanonicalizationPatterns 静态方法里显式 results.add<yourpattern>(context)</yourpattern>
  • 对应操作定义的 ODS 文件(.td)里得有 hasCanonicalizer = 1,否则该方法根本不会被调用
  • 运行 pass 时得明确启用 canonicalizer:比如用 mlir::createCanonicalizerPass(),或者在 PassManager 里加 pm.addPass(mlir::createCanonicalizerPass())
  • 如果你用的是自定义工具(如 toyc),确保它在构建 PassManager 时加载了你的 dialect,并调用了 loadDialect<yourdialect>()</yourdialect>,否则 pattern 注册代码压根不会执行

为什么有时 pattern 匹配了却不生效

常见但难定位的原因集中在“上下文生命周期”和“多次迭代顺序”上:

  • pattern 构造时传的 MLIRContext* 和实际运行时 PassManager 用的 context 不是同一个实例(比如你在测试代码里 new 了一个 context,但 pass 运行在另一个里),会导致 pattern 被忽略
  • canonicalizer 是贪婪迭代的:第一次只消掉外层 transpose(transpose(x)),生成新 IR 后会再跑一轮;但如果新 IR 里又引入了别的可优化结构(比如常量折叠),而你的 pattern 没覆盖那个 case,就会卡住
  • 多个 pattern 的 benefit 值相同,MLIR 不保证执行顺序,可能 A pattern 改了 IR 导致 B pattern 失效,反过来也一样——调试时建议一次只注册一个 pattern
  • IR 验证失败会终止整个 canonicalizer pass,但错误信息常藏在 verbose 日志里(加 -debug-only=canonicalize 才能看到),表面看起来就是“没反应”

真正麻烦的从来不是写 pattern,而是确认它在正确的 context 下、被正确的 pass 调用、作用在正确的 operand 上、并用正确的类型和位置完成替换。少一个环节,IR 就停在那儿不动。

相关文章

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

热门下载

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

精品课程

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