LLVM 中的Value、User、Use设计
概述
LLVM是一个强大的编译器基础设施,提供了一套丰富的库,用于构建编译器的前端和后端。在LLVM中,Value、User和Use是几个核心的概念,它们之间有着紧密的关系
Value
Value是LLVM中表示所有可计算的值的基类,例如常量、指令、参数等。每个Value都有一个类型(Type)和一个名字(Name)。Value是LLVM IR中所有可计算实体的抽象。
User
User是LLVM IR中表示使用Value的类。User可以是指令(Instruction)、常量表达式(ConstantExpr)、全局变量(GlobalVariable)等。User持有对Value的引用,并且可以有多个Value作为其操作数(Operands)
Use
Use是Value和User之间的一个引用关系。每个Use对象持有一个Value的引用,并且知道这个Value是由哪个User使用的
Use允许LLVM跟踪每个Value的所有使用情况,并且当Value被修改或删除时,可以更新所有引用它的地方
User和Use的双向关系
User和Use之间存在一个双向关系:
- User持有一个Use链表,每个Use指向一个Value
- Value持有一个User链表,每个User指向一个使用该Value的User对象
这种双向关系使得LLVM可以有效地管理值的生命周期和依赖关系
- 例如,当一个Value被删除或修改时,所有引用它的Use都会收到通知,从而可以更新或删除相应的引用
- 同样,当一个User被删除时,它持有的所有Use也会被删除,从而解除了对Value的引用
这种设计有几个关键的好处
- 封装性:Value、User和Use的分离使得LLVM的IR结构更加模块化和易于理解
- 灵活性:Use作为Value和User之间的桥梁,使得LLVM可以灵活地处理值的引用和更新
- 效率:通过双向链表,LLVM可以快速地遍历和更新值的使用情况,提高了编译器的效率
总的来说,LLVM的Value、User和Use设计提供了一种强大且灵活的方式来表示和操作编译器中间表示(IR)中的值和它们之间的关系
例子
例子1
假设我们有一个简单的LLVM IR代码片段:
define i32 @main() {%a = add i32 1, 2%b = add i32 %a, 3ret i32 %b
}
在这个例子中:
- %a 和 %b 是两个Value,它们是指令的结果
- add i32 1, 2和add i32 %a, 3是两个User,因为它们是指令,使用其他Value(在这个例子中是数字1, 2和3,以及%a)
- %a有两个Use,分别指向两个add指令
- 每个add指令都有一个Use列表,列出了它的操作数
解析
- 第一个add指令创建了一个Value %a。这个指令是一个User,它有两个操作数:常量1和2。这两个常量也是Value,但在这个例子中,它们没有被其他指令引用
- 第二个add指令创建了另一个Value %b。这个指令同样是一个User,它的操作数是%a和常量3。这里,%a是一个已经被第一个add指令创建的Value
- 每个Value都有一个指向引用它的User的列表。在这个例子中,%a的列表中有两个User:第一个和第二个add指令。常量1、2和3没有被其他指令引用,所以它们的列表为空
- 每个User都有一个Use列表,列出了它引用的所有Value。第一个add指令的Use列表包含两个常量1和2,第二个add指令的Use列表包含%a和常量3
例子2
定义Value
首先,定义一个简单的LLVM IR 代码片段,这里创建一个简单的加法操作
%1 = add i32 10, 20
在这个例子中,%1是一个Value,它代表了加法操作的结果.i32 是它类型,表示这是一个32位的整数
10 和 20 是操作数,它们也是Value
创建User
加法操作本身就是一个User,因为它使用了Value(这个例子是数字10和20)来执行操作
这个User 是一个指令,具体来说是add指令
建立Use关系
add 指令使用10和20这两个Value,因为它创建了两个Use对象
每个Use对象持有一个对Value的引用,并且知道这个Value是由哪个User使用的
双向关系
现在有了以下关系
- add 指令(User) 有两个Use对象,分别引用了10和20
- 10和20(Value) 各自有一个User列表,每个列表中都包含了引用它们的add指令
修改Value
假设修改了10这个Value,将其改为15
%1 = add i32 15,20
在这个修改过程中,Use对象仍然保持对新值15的应用,由于Use和Value之间双向关系,add指令自动更新为使用的新的Value
删除Value
如果要删除20这个Value:
%1 = add i32 15, 25
在这个情况下,原来引用20的Use对象会被删除,并且add指令的Use列表会更新为引用新的Value 25
同时,20的User列表也会被清空,表示没有User再使用它
遍历User 和 Value
通过add 指令(User 来遍历它的所有Use对象,从而找到它引用的所有Value。同样,我们也可以通过15或25来遍历所有引用他们的User
参考资料
- 深入浅出 LLVM之 Value 、User 、Use 源码解析
相关文章:
LLVM 中的Value、User、Use设计
概述 LLVM是一个强大的编译器基础设施,提供了一套丰富的库,用于构建编译器的前端和后端。在LLVM中,Value、User和Use是几个核心的概念,它们之间有着紧密的关系 Value Value是LLVM中表示所有可计算的值的基类,例如常…...
C++智能指针入门教程(C++11)
智能指针 1.定义 C中的智能指针是一种用于自动管理动态分配的内存的模板类,它们通过封装原始指针来提供自动的内存管理功能,从而避免了内存泄漏和悬挂指针等问题。C标准库中提供了几种智能指针类型,其中最常用的是std::unique_ptr、std:…...
常用工具推荐!分享7款AI论文修改软件工具网站
在当今学术研究和写作领域,AI论文修改软件工具已经成为了不可或缺的助手。这些工具不仅能够帮助研究人员提高写作效率,还能确保论文的质量和原创性。以下是七款值得推荐的AI论文修改软件工具网站,其中特别推荐千笔-AIPassPaper。 1. 千笔-AI…...
怎么解除BitLocker对磁盘的加密?
BitLocker是一种Windows操作系统内置的加密功能,用于保护用户的数据安全。它通过对整个磁盘进行加密,防止数据被未经授权的用户访问。BitLocker主要用于保护笔记本电脑和台式机中的重要数据,尤其是在设备丢失或被盗的情况下。怎么解除BitLock…...
群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档
文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 想象一下这个场景:如果遇到周末紧急需要改方案,但团队成员都在各自家中,这个时候如果大家能够轻松访问这个…...
Unity3d 以鼠标位置点为中心缩放视角(正交模式下)
思路整理: 缩放前: 缩放后: 记录缩放前鼠标的屏幕坐标 A,计算鼠标位置对应的世界坐标 A_world 缩放完成后,根据当前屏幕下A所对应的世界坐标A1_world 计算A1_world 和 A_world 的偏移量 移动摄像机 代码ÿ…...
Git清除某文件所有历史提交记录
一、软件要求 1.1 软件版本要求 git > 2.22.0python3 > 3.5 1.2 辅助插件 git filter-repo Linux/macOS # Debian/Ubuntu 系统 # 或使用 pip 安装pip install git-filter-repo sudo apt install git-filter-repo Windows pip install git-filter-repo二、操作步骤…...
jacoco生成单元测试覆盖率报告
前言 单元测试是日常编写代码中常用的,用于测试业务逻辑的一种方式,单元测试的覆盖率可以用来衡量我们的业务代码经过测试覆盖的比例。 目前市场上开源的单元测试覆盖率的java插件,主要有Emma,Cobertura,Jacoco。具体…...
【CSS Tricks】如何做一个粒子效果的logo
效果展示 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>粒子效果Logo</title>…...
如何使用ssm实现基于Javaweb的网上花店系统的设计与实现
TOC ssm653基于Javaweb的网上花店系统的设计与实现jsp 研究背景 自计算机发展以来给人们的生活带来了改变。第一代计算机为1946年美国设计,最开始用于复杂的科学计算,占地面积、开机时间要求都非常高,经过数十几的改变计算机技术才发展到今…...
Elastic 的 OpenTelemetry PHP 发行版简介
作者:Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…...
TCP 和 UDP 协议的区别?
参考TCP 和 UDP的区别_tcp和udp的区别-CSDN博客...
【PHP】使用thinkphp5查询最大值时,把varchar类型字段转换成数字
有时候我们需要把carchar类型的字段进行聚合函数运运行(max、min、avg),但是如果直接用聚合函数,得到的结果是错误的,因为varchar字段是字符串,无法直接使用聚合函数,所以需要把varchar字段转换…...
Java 正则表达式详解
正则表达式 (Regular Expression,简称 regex) 是一种强大的文本处理工具,可以用来匹配、搜索和替换文本中的特定模式。在 Java 中,正则表达式由 java.util.regex 包提供支持。 1. 理解正则表达式语法 正则表达式使用特殊的字符和符号来定义…...
MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)
目录 讲解一:窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数:求和 min函数 :最小值 1.2. 排序函数 1.3. 跨行函数…...
Jira Cloud涨价5%-20%,钉钉项目Teambition成优选替代
近日,Jira再次宣布涨价,Cloud版涨幅达到5%-20%,这一消息来源于Atlassian官方面向合作伙伴发布的2024年最新涨价通知。 Atlassian旗下核心产品,包括Jira、Confluence、JiraServiceManagement等的Cloud版本价格将有所提高ÿ…...
Python语言基础教程(下)4.0
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
【HTTP】构造HTTP请求和状态码
状态码 用于响应中,表示响应的结果如何 正确?错误?什么原因? HTTP 中的状态码都是标准约定好的 200 OK 成功了,一切顺利 在抓包到的响应中 404 Not Found 访问的资源(URL 中的路径)没找…...
Delta Lake如何使用
1. 安装 Java 确保你的系统上安装了 Java 8 或更高版本。可以通过以下命令检查 Java 是否已安装: java -version2. 安装 Apache Spark 下载 Spark: 从 Apache Spark 官方网站 下载适合的版本,建议下载预编译的版本(例如…...
面试题 - parallelStream() 有什么缺点 - ForkJoinPool,它和传统的线程池(如 ThreadPoolExecutor)的区别
底层使用 ForkJoinPool ,不同与线程池适用于连续的内存分布的数据结构,如数组和ArrayList(),并不适用于链表适用于 cpu 密集的工作,cpu 的核数多效率高,并行流能否真正提高性能,很大程度上取决于系统的可用…...
51单片机实战:UART串口通信与数据交互优化
1. UART串口通信基础与51单片机实战价值 我第一次用51单片机做UART通信时,连波特率是什么都搞不清楚,结果电脑发过来的数据全是乱码。后来才发现是单片机定时器初值算错了,这个经历让我深刻理解到串口通信基础的重要性。 串口通信就像两个人用…...
【开题答辩全过程】以 基于JSP框架的医疗管理系统为例,包含答辩的问题和答案
个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...
协议数采网关在智慧水务场景中的应用与功能
水资源管理作为生态文明建设的关键组成部分,其重要性不言而喻。在智慧水务建设不断深化的当下,水质监测、水量调度以及设备运维等各个环节,都对智能化水平提出了更为严苛的要求。然而,当前水务行业面临着诸多难题,监测…...
ESP32 Bootloader配置实战:如何优化启动时间与内存占用(附实测数据)
ESP32 Bootloader深度调优:从启动时间压缩到内存占用的实战指南 当你的ESP32设备在冷启动时需要等待超过500ms才能响应第一个用户指令,或是因内存不足频繁触发看门狗复位时,问题的根源往往隐藏在Bootloader的配置层。本文将带你穿透menuconfi…...
避开这些坑!用UDE STK 5.0给英飞凌AURIX芯片下载程序时,关于板卡休眠与唤醒的实战经验
避开这些坑!用UDE STK 5.0给英飞凌AURIX芯片下载程序时,关于板卡休眠与唤醒的实战经验 在嵌入式系统开发中,低功耗设计是一个永恒的话题。特别是对于汽车电子、工业控制等领域的应用,如何平衡系统性能和功耗表现,往往…...
高效音频获取与资源管理:喜马拉雅下载工具全解析
高效音频获取与资源管理:喜马拉雅下载工具全解析 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 在数字内容消费时代&a…...
Python AOT编译迎来分水岭:2026年3大工业级工具实测对比(启动提速8.7×,内存降63%,兼容CPython 3.13+)
第一章:Python AOT编译的范式跃迁与工业落地元年定义长期以来,Python 以解释执行和动态特性见长,但其运行时开销、启动延迟与内存 footprint 成为云原生服务、边缘设备与实时系统规模化部署的关键瓶颈。2024 年,随着 Nuitka 14.x、…...
零干扰聆听:铜钟音乐的极简主义开源解决方案
零干扰聆听:铜钟音乐的极简主义开源解决方案 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特!(密码重置功能已回归) 项目地址: https://gitcode.com/GitHub_Trending/to/ton…...
Ubuntu服务器上配置KVM虚拟化环境:从零搭建Windows开发环境
1. 为什么要在Ubuntu服务器上跑Windows? 很多开发者可能都有这样的困惑:明明手头有性能强劲的Ubuntu服务器,但某些开发工具只能在Windows环境下运行。比如Visual Studio、SQL Server Management Studio这些微软系工具,或者某些行业…...
Qwen2.5-72B-Instruct-GPTQ-Int4部署教程:vLLM与HuggingFace Transformers对比
Qwen2.5-72B-Instruct-GPTQ-Int4部署教程:vLLM与HuggingFace Transformers对比 1. 模型简介 Qwen2.5-72B-Instruct-GPTQ-Int4是Qwen大语言模型系列的最新版本,具有720亿参数规模。相比前代Qwen2,这个版本在多个方面实现了显著提升ÿ…...
