LLVM Pass的run函数应该返回什么

千丽小哥_2951

千丽小哥_2951

2026-10-06

594人浏览

原创

返回值决定ir修改状态:true触发分析失效和迭代终止,false导致陈旧分析引发错误;所有pass的run函数返回值语义统一,隐式修改(如replacealluseswith、setoperand)也需返回true。

llvm pass的run函数应该返回什么

runOnFunction 等 Pass 的 run 函数必须返回 bool,且语义明确:返回 true 表示 IR 被修改过,返回 false 表示未修改。

为什么返回值影响后续优化流程

LLVM Pass 管理器(PassManager)依赖这个返回值做两件事:

  • 决定是否触发 CFG(控制流图)或分析结果的无效化 —— 若返回 true,所有依赖该函数结构的分析(如 DominatorTree、LoopInfo)会被自动标记为过期,下次需要时重新计算
  • 影响 Pass 执行顺序和复用 —— 某些 Pass(如 InstructionCombiningPass)会反复运行直到收敛,每次运行后都检查返回值;若连续几次都返回 false,就认为已稳定,停止迭代

常见错误:把打印调试当修改,却返回 false

很多新手写完日志输出就直接 return false,但实际已经调用了 F.getBasicBlockList().push_back(...) 或 Inst->eraseFromParent() —— 这类操作确实改变了 IR,却没告诉 PassManager。

后果是:

Viral Video
Viral Video

一款基于AI的文字转视频创作工具,可将文字创意快速转化为适合社交媒体传播的视频内容和短视频素材。

下载
  • 后续 Pass 读到 stale(陈旧)的分析结果,比如 LoopInfo 仍认为某循环存在,但你刚把它拆成了两个基本块
  • 优化不生效或产生错误代码,尤其在组合多个 Pass 时(例如 opt -mem2reg -my-pass)
  • 调试时发现行为不一致:单独跑 my-pass 没问题,加在管线里就 crash

不同 Pass 类型的 run 函数签名与返回逻辑

不是所有 run 函数都叫 runOnFunction,返回值含义一致,但参数和触发粒度不同:

  • ModulePass::runOnModule(Module &M):作用于整个模块,返回 true 表示任何函数、全局变量或 metadata 被改动
  • FunctionPass::runOnFunction(Function &F):只承诺该函数内 IR 变更,不影响其他函数
  • BasicBlockPass::runOnBasicBlock(BasicBlock &BB):仅对该基本块负责,改了 BB 内指令就得返回 true
  • AnalysisPass(如 DominatorTreeWrapperPass):重写的是 runOnFunction,但注册时第 4 个参数为 true,此时返回值被忽略 —— 它不改 IR,只提供分析结果

最容易被忽略的边界情况

有些操作看似“只读”,实则隐式修改 IR:

  • 调用 F.replaceAllUsesWith(...):明显改了 use-list,必须返回 true
  • 调用 Inst->setOperand(0, NewVal):改了指令 operand,IR 已变
  • 调用 Builder.CreateCall(...) 插入新指令:哪怕只是 log,也新增了 Instruction,需返回 true
  • 但 errs() 或 <code>F.empty() 这类纯读取,可安全返回 false

真正难判断的,是那些间接修改 —— 比如你调用了一个封装函数,它内部调用了 eraseFromParent() 却没文档说明。这时候别猜,看源码或加断点验证 IR 的 getNumInstructions() 是否变化。

相关文章

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

80

10

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

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

2026.09.30

80

14

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

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

2026.09.30

80

12

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

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

2026.09.30

60

26

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

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

2026.09.29

60

15

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

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

2026.09.23

280

15

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

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

2026.09.23

160

15

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

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

2026.09.23

140

15

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

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

2026.09.22

80

12

热门下载

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

精品课程

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