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.mzph.cn/web/28431.shtml

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

相关文章

DOM 总结

DOM 总结 1. 引言 文档对象模型(DOM,Document Object Model)是一种跨平台和语言独立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM 是万维网联盟(W3C)的标准,被广泛应用于网页设计和开发中。本文将总结 DOM 的基本概念、核心功能和实际应用。 …

【安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录】

安装笔记-系列文章目录 安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 文章目录 安装笔记-系列文章目录安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 前言一、软件介绍名称&#xff1a;cifsutils主页官方介绍特点 二、安装步骤测试…

华为校招机试 - 排列组合的回文字符串(20230515)

题目描述 如果一个字符串和它反转后的字符串相同,我们称这个字符串为回文字符串。 如:"aba"是一个回文字符串,"abb"不是一个回文字符串(长度为 1 的字符串也是回文字符串)。 要给定一个字符串,其长度范围为:[1, 1000),返回其通过重新排列组合后…

exit和_exit函数和atexit函数

相对于return函数&#xff0c;exit和_exit是用于专门退出进程的函数&#xff0c;而return不是用于专门退出进程的&#xff0c;只是执行mian函数时&#xff0c;return可以退出进程。&#xff08;return退出当前函数执行的栈空间&#xff0c;并返回当前函数执行的结果&#xff09…

基于JSP技术的个人网站系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP JavaBeans Servlet 工具&#xff1a;Eclipse、MySQL Workbench、…

.net8 blazor auto模式很爽(五)读取sqlite并显示(2)

在BlazorApp1增加文件夹data&#xff0c;里面增加类dbcont using SharedLibrary.Models; using System.Collections.Generic; using Microsoft.EntityFrameworkCore;namespace BlazorApp1.data {public class dbcont : DbContext{public dbcont(DbContextOptions<dbcont>…

Java高频面试题整理(几万字)

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

卷积网络热图显示

【卷积神经网络可视化】之热度图可视化_visualizing heatmaps of class activation in an ima-CSDN博客

Java中的Stream API及其应用

Java中的Stream API及其应用 Java 8引入了Stream API,这是对集合进行复杂操作的强大工具。Stream API支持函数式编程风格,能够简洁、清晰地处理集合数据。本文将详细介绍Java中的Stream API及其实际应用场景。 一、Stream API简介 Stream是元素的序列,这些元素支持顺序和…

ctfshow-web入门-命令执行(web43-web52)关于黑洞“ >/dev/null 2>1“的处理与绕过

目录 1、web43 2、web44 3、web45 4、web46 5、web47 6、web48 7、web49 8、web50 9、web51 10、web52 1、web43 在上一题 ‘黑洞’ 的基础上新增过滤&#xff1a; preg_match("/\;|cat/i", $c) 问题不大&#xff0c;我们不用分号和 cat 就行&#xff1a;…

YoloV8改进策略:卷积篇|Kan行天下之GRAM,KAN遇见Gram多项式

GRAM的灵感来自于Kolmogorov-Arnold网络&#xff08;KAN&#xff09;的替代品&#xff0c;如TorchKAN和ChebyKAN。GRAM引入了一种KAN模型的简化版本&#xff0c;但利用了Gram多项式变换的简洁性。它与其他替代品的不同之处在于其独特的离散性特征。与其他在连续区间上定义的多项…

串口触摸屏的键盘控制

&#xff08;text 属性txt_maxl 800&#xff09; ①变量loadpageid.val&#xff1a;调用页的页面ID。 ②变量loadcmpid.val&#xff1a;调用页的控件ID。 ③定时器tm0&#xff1a;让输入框有个光标不断闪烁&#xff0c;如果不需要&#xff0c;控件属性en0即可。 ④变量inputlen…

Redis Cluster 为什么不支持传统的事务模型

Redis Cluster 采用了分布式的架构&#xff0c;其设计目标主要是为了提供高可用性和可伸缩性。Redis Cluster 的数据分片存储在不同的节点上&#xff0c;每个节点负责一部分数据。传统的 Redis 单节点事务是通过 MULTI/EXEC 命令实现的&#xff0c;但 Redis Cluster 不支持跨节…

【python操作Excel的方法】

当然&#xff0c;除了openpyxl和pandas之外&#xff0c;还有其他几种方法可以用来操作Excel文件。以下是一些常见的操作Excel的方法&#xff0c;并附带了相关的数字和信息&#xff08;基于提供的参考文章&#xff09;&#xff1a; 1. 使用Excel本身的宏和VBA 优势&#xff1a…

centos意外断电的情况下linux挂载磁盘报错(已解决)

问题描述 centos意外断电的情况下linux挂载磁盘报错&#xff0c;这大致是意外断电硬盘相关meta信息还未落盘之类的导致磁盘信息对不上 通过命令 kubectl describe pod minio-5b9765594b-g4bwt得到错误信息 Warning FailedMount 47m (x5 over 47m) kubelet MountVolume.Mount…

切片(slicing)(Python)

文章目录 前言一、基本语法二、基本操作1、字符串2、列表 前言 切片&#xff08;Slicing&#xff09;是Python中对于序列类型&#xff08;如字符串、列表、字节、元组等&#xff09;的一种操作&#xff0c;用于获取序列的子部分。 一、基本语法 sequence[start:stop:step]参数…

SEO优化笔记 个人博客如何SEO设置

说实话现在个人博客越来越难做了&#xff0c;因为现在大多数的流量都被短视频吸引去了&#xff0c;当然有很多个人博客作的非常的好&#xff0c;还是有很多的流量做支撑的&#xff0c;个人也是小白站长&#xff0c;折腾网站也很久了&#xff0c;也总结了几点&#xff0c;分享非…

ABI和API的区别

ABI和API的区别 ABI&#xff08;Application Binary Interface&#xff09;&#xff1a; ABI是一种定义了二进制接口规范的概念&#xff0c;用于描述不同模块之间如何进行二进制交互。它定义了函数调用约定、参数传递方式、寄存器使用、内存布局等底层细节。ABI的目标是确保不…

C++风流和MATLAB | Python | CUDA 库埃特流泊肃叶流薄膜流体

&#x1f3af;要点 &#x1f3af;无滑移速度边界条件&#xff1a;&#x1f58a;反弹法计算库埃特流、泊肃叶流 | &#x1f58a;湿节点法计算库埃特流、泊肃叶流 | &#x1f3af;力模型&#xff1a;&#x1f58a;反弹法和不同的格子玻尔兹曼体力模型计算泊肃叶流 | &#x1f58…

自监督分类网络:创新的端到端学习方法

现代人工智能的快速发展中&#xff0c;分类任务的高效解决方案一直备受关注。今天&#xff0c;我们向大家介绍一种名为Self-Classifier的全新自监督端到端分类学习方法。由Elad Amrani、Leonid Karlinsky和Alex Bronstein团队开发&#xff0c;Self-Classifier通过优化同一样本的…