LLVM 中 的 pass 及其管理机制 概述LLVM 编译器框架的核心概念是任务调用和执行编译器开发者将IR分解为不同的处理对象并将其处理过程实现为单独的pass类型。在编译器初始化pass被实例化并被添加到pass管理中pass 管理器(pass manager) 以流水线的方式将各个独立的pass 衔接起来然后以预定义顺序遍历每个pass根据pass实例返回值启动、停止或重复运行不同的pass因此LLVM pass 管理机制的主要模块包括pass、pass 管理器、pass注册及相关模块如PassRegistry、AnalysisUsage、AnalysisResolver 等PASS 的作用pass 是一种编译器开发的结构化技术用于完成编译器对象(如IR)的转换、分析或优化等功能。 pass的执行过程就是编译器对编译对象进行转换、分析和优化过程LLVM 提供的pass 分为三类: 分析(analyis) pass、转换(transform) pass 和 工具(utility) pass分析(analyis) pass分析pass 复杂计算相关IR单元的高层信息但不对其进行修改这些信息可以被其他pass使用或用于程序调试和可视化。简言之分析pass 提供其他pass 需要查询的信息并提供查询接口例如基本别名分析(Basic Alias Analysis) pass 生成的别名分析结果可以用于后续的其他优化pass分析pass 不仅从IR中得到有用信息还可以通过调用其他分析pass得到信息并将这些信息结合起来得到IR相关的、更有价值的信息这些分析结果可以被缓存下来避免重复计算。如果分析的IR 被修改原有的分析结果当然也就失效了转换(transform) pass转换pass 可以查询和使用分析pass 分析得到的IR高层信息然后以某种方式改变和优化IR并保证改变后的IR仍然合法有效例如激进死代码消除(Aggressive Dead Code Elimination, ADCE) pass 可根据其他分析pass的分析结构将死代码从原来的模块中删除工具(utility) pass工具pass 是一些功能性的实用程序既不属于分析pass也不属于转换pass。例如块提取(extract-blocks) pass 可将基本块从模块中提取出来供其他工具(如bugpoint) 使用当调用RegisterPass() 函数注册自定义pass时会要求指定是否为分析pass。通过RegisterPass()注册自定义pass后就可以使用LLVM opt 工具对IR调用自定义pass 功能LLVM Pass及常用子类LLVM Pass 是 LLVM 系统的重要组成部分。其基础模块是Pass 类这是所有LLVM Pass 的基类。Pass类定义见llvm_root/llvm/include/llvm/Pass.hclass Pass { AnalysisResolver *Resolver nullptr; // Used to resolve analysis const void *PassID; PassKind Kind; public: explicit Pass(PassKind K, char pid) : PassID(pid), Kind(K) {} Pass(const Pass ) delete; Pass operator(const Pass ) delete; virtual ~Pass(); …… }基于Pass类可派生LLVM的各种预定义Pass子类。自定义的pass类都要从预定义Pass子类中继承并根据自定义pass的具体功能要求重写虚函数或增加新的功能函数预定义子类包括ModulePass、CallGraphSCCPass、FunctionPass、LoopPass和ReginPass类等不同的子类有不同的约束条件、这些约束条件在调度pass时会用到。设计自定义pass时的首要条件就是确定自定义pass的基类在为pass选择基类时应在满足功能要求的前提下尽可能选择最相关的类。这些类会为LLVM Pass 基础结构提供优化运行所必需的信息避免生成的编译器因为选择的基类不合适而导致运行速度变慢或其他缺陷编译器可以将各种pass组合在一起完成各种IR优化任务。pass之间组合可以分为两类:多个pass作用于同一个IR单元FunctionPass就是一个典型例子。如图4-7a所示FunctionPass实例作用于一个IR函数但也可以在某个FunctionPass 实例中运行其他几个FunctionPass 实例将几个FunctionPass实例组合起来作用于同一个IR单元以获得更好的优化效果将一个IR 单元分解为更小的单元并用相应类型的pass处理。如图4-7b所示ModulePass作用于一个IR模块但也可以在某个ModulePass 实例作用于模块中的每一个函数以将一个IR单元分解成粒度更细的多个单元来处理总结在编译器开发时可以混合使用两种方式将各种pass组合为流水线对IR做不同的处理和优化LLVM Pass 类及其子类的继承关系如下图所示参考资料LLVM中的pass及其管理机制编译入门那些事儿1LLVM中的Pass和PassManager

相关新闻

最新新闻

番茄小说下载器终极指南:一站式自动化工具助您轻松保存全网小说资源

番茄小说下载器终极指南:一站式自动化工具助您轻松保存全网小说资源

番茄小说下载器终极指南:一站式自动化工具助您轻松保存全网小说资源 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 想要永久珍藏番茄小说平台上的精彩作品吗?这款免…

2026/7/31 19:13:17
typst.app上使用chicv的终极攻略:无需安装,在线编辑专业简历

typst.app上使用chicv的终极攻略:无需安装,在线编辑专业简历

typst.app上使用chicv的终极攻略:无需安装,在线编辑专业简历 【免费下载链接】chicv A minimal and fully-customizable CV template for Typst. 项目地址: https://gitcode.com/gh_mirrors/ch/chicv 在竞争激烈的求职市场中,一份专业…

2026/7/31 19:13:17
2026年GEO服务商榜单:南京教育赛道领跑,谁在定义AI搜索时代的品牌认知?

2026年GEO服务商榜单:南京教育赛道领跑,谁在定义AI搜索时代的品牌认知?

2026年,生成式AI搜索正在全面重构用户获取信息的方式与商业决策的逻辑。当消费者不再逐页浏览搜索结果,而是直接向豆包、DeepSeek、文心一言等AI工具提问“哪家机构更靠谱”“哪个品牌值得选”时,品牌竞争的战场已从传统搜索页提前进入了AI的…

2026/7/31 19:13:17
rhino3dm模型序列化与传输:高效处理3DM文件的秘诀

rhino3dm模型序列化与传输:高效处理3DM文件的秘诀

rhino3dm模型序列化与传输:高效处理3DM文件的秘诀 【免费下载链接】rhino3dm Libraries based on OpenNURBS with a RhinoCommon style 项目地址: https://gitcode.com/gh_mirrors/rh/rhino3dm rhino3dm是基于OpenNURBS几何库的一组库,采用"…

2026/7/31 19:13:17
6款一键生成论文工具汇总

6款一键生成论文工具汇总

真正的学术 AI,从不替你代笔,而是做你的选题军师、文献管家、逻辑教练、润色专家。从中文毕业论文到英文期刊发表,从框架搭建到降重合规,这 6 款工具覆盖全场景,帮你用最低时间成本,写出高质量、高原创、高…

2026/7/31 19:13:17
2026年论文AIGC率多少正常?五档自测表告诉你要不要处理

2026年论文AIGC率多少正常?五档自测表告诉你要不要处理

“AIGC检测率多少算正常?”——你在网上搜到的答案可能已经过时了。2026年各高校的标准在收紧,985/211和普通院校的要求差距在拉大。嘎嘎降注册送1000字免费测试,比话送500字,不确定自己达不达标的话先测一段看看。 2026年各类院校…

2026/7/31 19:08:16

月新闻