当前位置: 首页 > news >正文

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 的偏移量 移动摄像机 代码&#xff…...

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年美国设计&#xff0c;最开始用于复杂的科学计算&#xff0c;占地面积、开机时间要求都非常高&#xff0c;经过数十几的改变计算机技术才发展到今…...

Elastic 的 OpenTelemetry PHP 发行版简介

作者&#xff1a;Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…...

TCP 和 UDP 协议的区别?

参考TCP 和 UDP的区别_tcp和udp的区别-CSDN博客...

【PHP】使用thinkphp5查询最大值时,把varchar类型字段转换成数字

有时候我们需要把carchar类型的字段进行聚合函数运运行&#xff08;max、min、avg&#xff09;&#xff0c;但是如果直接用聚合函数&#xff0c;得到的结果是错误的&#xff0c;因为varchar字段是字符串&#xff0c;无法直接使用聚合函数&#xff0c;所以需要把varchar字段转换…...

Java 正则表达式详解

正则表达式 (Regular Expression&#xff0c;简称 regex) 是一种强大的文本处理工具&#xff0c;可以用来匹配、搜索和替换文本中的特定模式。在 Java 中&#xff0c;正则表达式由 java.util.regex 包提供支持。 1. 理解正则表达式语法 正则表达式使用特殊的字符和符号来定义…...

MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)

目录 讲解一&#xff1a;窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数&#xff1a;求和 min函数 &#xff1a;最小值 1.2. 排序函数 1.3. 跨行函数…...

Jira Cloud涨价5%-20%,钉钉项目Teambition成优选替代

近日&#xff0c;Jira再次宣布涨价&#xff0c;Cloud版涨幅达到5%-20%&#xff0c;这一消息来源于Atlassian官方面向合作伙伴发布的2024年最新涨价通知。 Atlassian旗下核心产品&#xff0c;包括Jira、Confluence、JiraServiceManagement等的Cloud版本价格将有所提高&#xff…...

Python语言基础教程(下)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…...

【HTTP】构造HTTP请求和状态码

状态码 用于响应中&#xff0c;表示响应的结果如何 正确&#xff1f;错误&#xff1f;什么原因&#xff1f; HTTP 中的状态码都是标准约定好的 200 OK 成功了&#xff0c;一切顺利 在抓包到的响应中 404 Not Found 访问的资源&#xff08;URL 中的路径&#xff09;没找…...

Delta Lake如何使用

1. 安装 Java 确保你的系统上安装了 Java 8 或更高版本。可以通过以下命令检查 Java 是否已安装&#xff1a; java -version2. 安装 Apache Spark 下载 Spark&#xff1a; 从 Apache Spark 官方网站 下载适合的版本&#xff0c;建议下载预编译的版本&#xff08;例如&#xf…...

面试题 - parallelStream() 有什么缺点 - ForkJoinPool,它和传统的线程池(如 ThreadPoolExecutor)的区别

底层使用 ForkJoinPool &#xff0c;不同与线程池适用于连续的内存分布的数据结构&#xff0c;如数组和ArrayList()&#xff0c;并不适用于链表适用于 cpu 密集的工作&#xff0c;cpu 的核数多效率高&#xff0c;并行流能否真正提高性能&#xff0c;很大程度上取决于系统的可用…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...