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.h

class Pass {AnalysisResolver *Resolver = nullptr;  // Used to resolve analysisconst 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之间组合可以分为两类:

  1. 多个pass作用于同一个IR单元,FunctionPass就是一个典型例子。如图4-7a所示,FunctionPass实例作用于一个IR函数,但也可以在某个FunctionPass 实例中运行其他几个FunctionPass 实例,将几个FunctionPass实例组合起来,作用于同一个IR单元,以获得更好的优化效果

  2. 将一个IR 单元分解为更小的单元,并用相应类型的pass处理。如图4-7b所示,ModulePass作用于一个IR模块,但也可以在某个ModulePass 实例,作用于模块中的每一个函数,以将一个IR单元分解成粒度更细的多个单元来处理

总结

在编译器开发时,可以混合使用两种方式,将各种pass组合为流水线,对IR做不同的处理和优化

LLVM Pass 类及其子类的继承关系如下图所示
在这里插入图片描述

参考资料

  • LLVM中的pass及其管理机制
  • 编译入门那些事儿(1):LLVM中的Pass和PassManager

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/351668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCS-华为云Stack-容器网络

HCS-华为云Stack-容器网络 容器隧道overlay VPC网络

vue3轮播图怎么做

先看效果 实现代码 <n-carouseleffect"card"dot-type"line"draggable:autoplay"!isHovered":current-index"currentIndex"prev-slide-style"transform: translateX(-150%) translateZ(-450px);opacity:1"next-slide-st…

结构设计模式 - 桥接设计模式 - JAVA

桥接设计模式 一. 介绍二. 桥接模式示例2.1 定义实现部分和具体实现2.2 定义抽象部分和细化抽象部分2.3 测试2.4 解释 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一.…

windows11 x64 23H2 企业纯净版2024.6.16

闲来无事试安装了下da_nao_yan的 【6月12日更新】Windows11 22631.3737企业版 23H2 自用优化版 &#xff08;原版地址&#xff1a;https://bbs.pcbeta.com/viewthread-1985546-1-1.html&#xff09;&#xff0c;感觉比原版流畅多了&#xff0c;重新按照自己习惯封装了下&#x…

使用 C# 进行面向对象编程:第 9 部分

使用 OOP 的用户活动日志 应用程序背后的关键概念 在这一部分中&#xff0c;我们将使用之前学到的一些 OOP 概念。我们将创建一个小型应用程序。在继续之前&#xff0c;请阅读我的文章user-activity-log-using-C-Sharp-with-sql-server/。在本课程中&#xff0c;我们将再次使…

LabVIEW进行负载测试

本文介绍了如何使用LabVIEW进行负载测试&#xff0c;通过一个具体案例详细讲解了测试系统的组成、工作原理和实现方法。系统采用先进的硬件和软件架构&#xff0c;结合LabVIEW的强大功能&#xff0c;成功实现了对设备的高效负载测试&#xff0c;确保了系统的可靠性和性能。 项…

拥抱开源,构建未来:王嘉树与 TDengine 的开源之旅

在当代的技术浪潮中&#xff0c;开源文化不仅催生了无数创新技术&#xff0c;也为广大技术爱好者提供了一个展示才华、相互学习的平台。我们今天采访到的这位北京邮电大学电子工程学院的研究生&#xff0c;就是在这样的背景下&#xff0c;通过开源活动不断探索、学习并实现自我…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考吧

结合最近几年的活动安排&#xff0c;预计2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地准备汉字小达人比赛呢&#xff1f; 我的建议是充分利用即将到来的暑假&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0…

Docker 安装 MySQL5.7 和 MySQL8

文章目录 安装 MySQL5.7拉取镜像前期准备启动容器 安装MySQL8.0拉取镜像查看镜像前期准备启动容器 安装 MySQL5.7 拉取镜像 docker pull mysql:5.7拉下来镜像后 执行 docker images 此时我们已经有这个镜像了。 前期准备 在根目录下创建 app &#xff0c; 在 app 目录下创建…

蚂蚁SEO的蜘蛛对网页收录有帮助吗 ?

网页蜘蛛对网站收录有着至关重要的帮助。在深入探讨这一话题之前&#xff0c;我们首先需要了解网页蜘蛛的工作原理及其在互联网生态系统中的角色。 网页蜘蛛&#xff0c;也被称为网络爬虫或网络机器人&#xff0c;是搜索引擎的核心组成部分。它们按照特定的算法和规则&#xff…

力扣231. 2 的幂(位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.若为0和负数则直接返回false&#xff1b; 2.利用一个标志数mask令其为一&#xff0c;不断的算术左移同时和n做与&#xff08;&&#xff09;运算&#xff0c;统计n中二进制位为1的个数&a…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

windows环境下配置git环境变量

路由当前目录 vim 打开 .bash_profile PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.4.3nts PATH$PATH:/d/phpstudy_pro/Extensions/php8/php8.2.9nts PATH$PATH:/d/phpstudy_pro/Extensions/composer2.5.8 …

搭建一个简单的深度神经网络

目录 一、引入所需要的库 二、制作数据集 三、搭建神经网络 四、训练网络 五、测试网络 本博客实验环境为jupyter 一、引入所需要的库 torch库是核心&#xff0c;其中torch.nn 提供了搭建网络所需的所有组件&#xff0c;nn即神经网络。matplotlib类似与matlab&#xff0…

【react小项目】bmi-calculator

bmi-calculator 目录 bmi-calculator初始化项目01大致布局01代码 02完善样式02代码 03输入信息模块03代码 04 使用图表04代码 05详细记录信息渲染05代码 06 让数据变成响应式的06-1输入框的数据处理06-2图表&#xff0c;和记录信息的区域数据处理 07 删除功能&#xff0c;撤销功…

弗洛伊德算法——C语言

弗洛伊德算法&#xff0c;是一种用于解决所有顶点对之间最短路径问题的经典算法&#xff0c;该算法通过动态规划的方法计算出从每个顶点到其他所有顶点的最短路径。 弗洛伊德算法的基本思想是逐步考虑每一个顶点作为中间点&#xff0c;更新所有顶点对之间的最短路径。它通过以…

mySql的事务(操作一下)

目录 1. 简介2. 事务操作3. 四大特性4. 并发事务问题5. 脏读6. 不可重复读7. 幻读事务隔离级别参考链接 1. 简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作…

html是什么?http是什么?

html Html是什么&#xff1f;http是什么&#xff1f; Html 超文本标记语言&#xff1b;负责网页的架构&#xff1b; http(&#xff08;HyperText Transfer Protocol&#xff09;超文本传输协议&#xff1b; https&#xff08;全称&#xff1a;Hypertext Transfer Protocol …

VMware 桥接网络突然无法上网

VMware 桥接网络突然无法上网 0. 问题1. 解决方法 0. 问题 昨天&#xff0c;VMware 桥接网络正常使用&#xff0c;今天突然无法上网。 1. 解决方法 打开VMware的虚拟网络编辑器&#xff0c;将桥接模式的网络从“自动”改成你要使用的网卡&#xff0c;问题解决。 完成&#…

Numpy

文章目录 一、数据维度的概念1.1常见的多维数据1.2numpy的维度、形状、轴1.2.1维度1.2.2形状1.2.3轴 1.3reshape()函数1.4numpy中行、列向量的表示1.5数组的迭代1.6添加/删除元素1.6.1append()1.6.2insert()1.6.3delete() 二、Ndarray对象2.1简介2.1.1常用属性2.1.2.ndarray对象…