LLVM opt的-passes参数怎么组合多个优化

老宇同学_5665

老宇同学_5665

2026-09-30

626人浏览

原创

-opt -passes参数必须用逗号分隔,空格或换行会导致后续pass被忽略;仅llvm 10+支持,顺序即执行顺序,不支持重复名,需查opt -help-list-only=optimizations确认可用名,不可与旧flag混用。

llvm opt的-passes参数怎么组合多个优化

opt -passes 参数必须用逗号分隔,不能空格或换行

直接写 -passes="instcombine,deadargelim,dce" 才生效;写成 -passes="instcombine deadargelim dce" 或分行、加引号外空格都会被 opt 忽略中间部分,只执行第一个 pass。

这是最常踩的坑:很多人复制文档示例时没注意引号内格式,结果以为 pass 没起作用,其实是语法解析失败导致后续 pass 被丢弃。

  • -passes 是 LLVM 新 Pass 管理器(PM)的接口,从 LLVM 10+ 开始逐步替代旧的 -instcombine 这类独立 flag
  • 顺序即执行顺序,比如 mem2reg,instcombine,gvn 中 mem2reg 必须在 instcombine 前,否则后者可能无法合并因未提升而残留的 load/store
  • 不支持重复 pass 名——instcombine,instcombine 不会运行两次,只执行一次

哪些 pass 名字能用,得查当前 LLVM 版本支持的列表

opt -help-list-passes 输出的是“分析类 pass”为主,真正可用的优化 pass 名需要运行 opt -help-list-only=optimizations(LLVM 14+)或 opt -O2 -debug-pass=Structure 看实际 pipeline 构成。

常见可用名包括:mem2reg、instcombine、gvn、simplifycfg、loop-simplify、licm,但像 inline 实际对应的是 function-attrs,inline 组合,单独写 inline 会报错 “Pass 'inline' is not registered”。

Consensus
Consensus

一款AI工具,主要用于一个新型搜索引擎,利用AI在科学研究中为你找到答案,适合需要提升相关任务效率的用户。

下载
  • 函数级 pass(如 instcombine)默认作用于每个函数;模块级 pass(如 globaldce)需确保它在 pipeline 中处于合适层级
  • 有些 pass 有隐式依赖,例如 gvn 要求 IR 已做 mem2reg 和 simplifycfg,否则可能跳过优化或触发断言失败
  • LLVM 17+ 开始,-passes 支持嵌套语法,如 default<o3>,loop-vectorize</o3>,但自定义组合仍建议显式列出

和旧式 -flag 写法混用会出问题

不能同时用 -passes 和 -instcombine 这类老参数。一旦出现 -passes,opt 就完全切换到新 PM 模式,所有传统 flag(如 -dce、-inline)会被静默忽略,不报错也不执行。

比如这条命令:opt -passes="dce" -dce input.ll,只有 dce 在 -passes 里生效,后面的 -dce 完全无效——这不是 bug,是设计如此。

  • 调试时可用 -debug-pass=Arguments 查看最终解析出的 pass 列表
  • 若要保留旧习惯,坚持用单 flag,就别碰 -passes;想用 pipeline 控制力,就得彻底放弃 -instcombine 等独立选项
  • Clang 编译时加 -mllvm -passes=... 也能透传,但要注意 Clang 自身插入的默认 pass 会与你指定的叠加,顺序不可控

验证组合是否真按预期运行了

光看输出 IR 不够,得用 -verify-each 或 -debug-pass=Executions 确认每个 pass 是否被调用。特别是 gvn、licm 这类条件性强的 pass,IR 不变不代表没运行,可能只是没找到优化点。

  • opt -passes="instcombine,gvn" -verify-each input.ll 2>&1 | grep "GVN" 可确认 GVN 是否触发
  • 加 -stats 能看到各 pass 修改的指令数,比肉眼查 IR 更可靠
  • 如果某 pass 总不生效,先检查输入 IR 是否满足前提:比如 loop-vectorize 要求循环已做 loop-simplify 和 indvars,否则直接跳过

真正麻烦的不是怎么写,而是每个 pass 对 IR 形态有隐式要求,组合前得清楚它们的输入契约——这没法靠试错,得查对应 Pass 的源码注释或 llvm/lib/Transforms/ 下的文档片段。

相关文章

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

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

下载

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

相关专题

更多
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

200

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

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

80

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

60

19

loomy官网入口地址合集
loomy官网入口地址合集

本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

2026.09.22

80

19

热门下载

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

精品课程

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