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

数据流分析之def-use链分析

数据流分析之def-use链分析

  • 引言
  • 1 相关概念
  • 2 算法
    • 2.1 算法规则
    • 2.2 算法流程
    • 2.3 算法优化
  • 3 举例

引言

编译过程中,知道函数中每个指令引用的变量(或虚拟寄存器)来自于前面的哪一次赋值是很有必要的。例如llvm中对store/load转phi优化,就需要准确知道该信息。def-use链分析(也叫定值分析)能帮助我们准确地建立这些信息。

1 相关概念

  • 入口定值列表
    指每条指令执行前的相关变量的可能值。指令n的入口定值集合表示为in[n],n为指令序号、元素为寄存器+赋值指令序号的二元组;

  • 出口定值列表
    指每条指令执行后的相关变量的可能值。指令n的出口定值集合表示为out[n],n为指令序号、元素为寄存器+赋值指令序号的二元组;

  • 生成定值
    指令操作中,对寄存器的修改又称为生成定值。指令n的生成定值集合表示为gen[n],n为指令序号、元素为寄存器+赋值指令序号的二元组(一般有0个或1个元素);

  • 杀死定值
    若一条指令对寄存器R生成了定值,其他指令对R的生成定值称为对该条指令关于R的杀死定值。指令n的杀死定值集合表示为kill[n],n为指令序号、元素为寄存器+赋值指令序号的二元组;

注:定值分析就是分析每条指令执行前后的入口定值列表和出口定值列表。另外对于对于llvm IR这种SSA类型指令,上述集合元素可以直接是指令序号或指令指针(因为指令序号/指针与定值寄存器是等价的)。

2 算法

2.1 算法规则

整个算法其核心思想是如下三条规则:

  1. 若变量属于gen[n],必属于out[n]。即用每个指令结点的gen初始化其out;
  2. 若变量属于out[n],必属于n的后继结点e的out[e]。即沿着有向图正向求并集传播;
  3. 若变量属于in[n]且不属于kill[n],必属于out[n]。即kill会阻止正向传播;

2.2 算法流程

  1. 首先,将函数的指令按执行顺序(包括跳转顺序)串成一个有向图,每个结点对应一条指令;
  2. 将每个指令结点n的 gen[n] 添加到 out[n] 中(添加前 out[n] 为空集合);
  3. 反复执行如下操作,直到所有结点的 in 和 out 没有变化:
    将每个结点n的 out[n] 添加到其后继结点e的 in[e] 中;
    将每个结点n的 in[n] 中、且不在 kill[n] 中的变量添加到out[n]中;

2.3 算法优化

3 举例

相关文章:

数据流分析之def-use链分析

数据流分析之def-use链分析引言1 相关概念2 算法2.1 算法规则2.2 算法流程2.3 算法优化3 举例引言 编译过程中,知道函数中每个指令引用的变量(或虚拟寄存器)来自于前面的哪一次赋值是很有必要的。例如llvm中对store/load转phi优化,就需要准确知道该信息…...

【0175】【内存上下文】如何利用context_freelists[]来彻底释放MemoryContext中分配的所有内存(8 - 2)

文章目录 1. MemoryContext 删除的另一种形式1.1 context_freelists[] 数组1.1.1 context_freelists[0] 和 context_freelists[1] 的意义1.1.2 context_freelists[0] 和 context_freelists[1] 各自功能示意图1.2 context_freelists[] 各成员在删除context时的初始化情况1.2.1 c…...

Redis实战—黑马点评(一) 登录篇

Redis实战 — 黑马点评(一) 登录篇 来自黑马的redis课程的笔记 【黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】 目录Redis实战 — 黑马点评(一) 登录篇1. 项目…...

建造者模式-搭建Qt窗口案例

文章目录logging日志输出子线程设计模式可视化插件类界面设计呼吸灯实现综合案例实现本综合案例,应用到如下的知识点。logging日志输出 自定义日志记录器,实现将日志输出到指定的控件中。 # 自定义日志记录器类子线程 threading实现子线程及Qt中的子线…...

*from . import _imaging as core : ImportError: DLL load failed: 找不到指定的模块

错误提示如上。为了解决这个问题,首先参考了解决 from . import _imag…模块。. 首先尝试了彻底卸载pillow:conda uninstall pillow ; pip uninstall pillow 然后重装 pip install pillow,发现问题仍然没有解决。 并且尝试了windo…...

关于尚硅谷Hadoop-报错解决方案日志

以后都会将学习Hadoop中遇到的问题写到这里,供自己参考,能帮到大家更好SecondaryNameNode未启动解决办法:可能是端口被占用(我没遇到)hadoop104未在/etc/hosts配置映射路径我在hadoop104的/etc/hosts 添加了所有hadoop…...

前端高频面试题-HTML和CSS篇(二)

💻 前端高频面试题-HTML和CSS篇(二) 🏠专栏:前端面试题 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向…...

神经网络损失函数分布可视化神器

论文名称和地址:Visualizing the Loss Landscape of Neural Netshttps://arxiv.org/pdf/1712.09913.pdf1.1 背景和动机作者主要想研究几个问题:为什么我们能够最小化高度非凸神经损失函数?为什么得到的最小值这个结果具有泛化性?不…...

ansible的部署与命令模块

目录 一、ansible的概述 1、ansible简介 2、ansible特点 3、官方网站 4、ansible的模块组成 5、ansible的工作机制 二、ansible部署 1、ansible的安装 三、ansible的命令行模块 1、command模块 2、shell模块 3、cron模块 4、user模块 5、group模块 6、copy模块 7…...

开发人员与测试人员关系的理解

在软件开发中都会有开发人员(以下简称开发)和测试人员(以下简称测试),在一些小型公司可能并没有测试,仅仅是开发兼任测试。在这里我仅针对于有专业的测试和专业的开发的项目。 每个公司应该都有考核机制&am…...

直面原理:5 张图彻底了解 Android TextToSpeech 机制

ChatGPT 如此火爆,但它的强悍在于 NLU(自然语言理解)、DM(对话管理)和 NLG (自然语言生成)这三块,而 Recognition 识别和 TTS 播报这两块是缺失的。假使你的 App 接入了 ChatGPT&…...

Ruby Socket 编程

Ruby提供了两个级别访问网络的服务,在底层你可以访问操作系统,它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。 Ruby 统一支持应用程序的网络协议,如FTP、HTTP等。 不管是高层的还是底层的。ruby提供了一些基本类&a…...

Vue3+ElementPlus+koa2实现本地图片的上传

一、示例图二、实现过程利用Koa2书写提交图片的后台接口这个模块是我写的项目中的其中一个板块——上传图片,这个项目的后台接口主要是是使用了后端的Koa2框架,前端小伙伴想要试着自己书写一些增删改查的接口可以从这个入手,Koa2用来了解后端…...

常见漏洞之 Fastjson

数据来源 01 Fastjson相关介绍 》Fastjson概述 》Fastjson历史漏洞 02 Fastson的识别与漏洞发现 》Fastjson寻找 》Fastjson漏洞发现(利用 dnslog) 03 修复建议 建议1:使用fastjson1.2.83版本; Github地址:https:…...

绕过Nginx Host限制

目录绕过Nginx Host限制SNI第三种方法:总结绕过Nginx Host限制 SNI SNI(Server Name Indication)是 TLS 的扩展,这允许在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称。 作用:用来解决一个服务器拥有…...

Visual Studio 2022 常用快捷键,记录一下别忘记~

Visual Studio 2022 常用快捷键,记录一下别忘记~ CtrlEC 注释代码 CtrlEU 取消注释代码 CtrlED 格式化全部代码 CtrlShiftA 新建类 CtrlRG 删除无效Using CtrlH 批量替换 CtrlG 跳转到指定行 CtrlEE 在交互窗口中运行选中代码(很实用) AltEnter 快速引用 …...

软件测试回顾---重点知识

软件测试重点知识回顾 8.1.1软件测试的目的是 尽可能的发现程序中的错误并不是发现所有的错误并不是证明程序是错误的也不是为了调试程序8.1.2白盒测试根据什么设置测试用例?黑盒测试根据什么设置测试用例? 白盒测试根据内部逻辑来设计的黑盒测试根据的是…...

2D图像处理:2D Shape_Base_Matching_缩放_旋转_ICP_显示ROI

文章目录 调试结果参考调试说明问题0:并行运行问题问题1:模板+Mask大小问题问题2:组合缩放和旋转问题3:可以直接将计算边缘的代码删除问题4:如何在原始图像上显示匹配到的ROI问题5:计算的原始旋转角度不需要判断,直接可以在ICP中使用问题6:绘制坐标轴问题7:绘制ROI调试…...

HTTP、HTTPS

目录 1.HTTP 1.1.概述 1.2.报文结构 1.2.1.请求报文 1.2.2.响应报文 1.3.方法 2.HTTPS 1.HTTP 1.1.概述 HTTP,超文本传输协议,WEB体系选用了该协议作为应用层协议。 1.2.报文结构 1.2.1.请求报文 HTTP的请求报文(request&#xff0…...

计算机网络之http03:HTTPS RSA握手解析

不同的秘钥交换算法,握手过程可能略有差别 上文对HTTPS四次握手的学习 SSL/TLS Secure Sockets Layer/Transport Layer Security 协议握手过程 四次通信:请求服务端公钥 2次 秘钥协商 2次 (1)ClientHello请求 客户端向服务端发送client…...

Canvas Quest在在线教育中的应用:个性化学习头像生成系统

Canvas Quest在在线教育中的应用:个性化学习头像生成系统 1. 教育场景中的个性化需求 在线教育平台面临一个共同挑战:如何让屏幕前的学习体验更具吸引力。传统头像系统往往提供有限的预设选择,难以反映学生的个性特点和学习历程。Canvas Qu…...

C++ MapViewOfFile 内存映射实战:解锁Windows大文件高效处理

1. 为什么需要内存映射技术? 如果你曾经尝试用传统方式读取几个GB的大文件,可能会遇到性能瓶颈。我做过一个实验:用fread逐块读取1GB的日志文件,耗时超过3秒;而改用内存映射方式,同样的文件仅需不到0.5秒。…...

保姆级教程:用Abaqus搞定气动软体抓手的仿真建模(从材料设置到结果提取)

从零到一:Abaqus气动软体抓手仿真实战指南 在软体机器人研究领域,气动抓手因其柔顺性和适应性成为热门方向。但许多初学者在仿真环节常被材料参数转换、接触设置收敛等"隐形门槛"绊住。本文将手把手带您突破这些瓶颈——从Yeoh模型参数导入到接…...

CAPL文件读写踩坑实录:fileGetString和fileGetStringSZ到底怎么选?

CAPL文件读写深度解析:fileGetString与fileGetStringSZ的实战抉择 当你在CANoe环境中用CAPL处理日志文件时,是否遇到过这样的场景:明明代码逻辑正确,但字符串比较总是失败?或者从CSV文件读取的数据总带着奇怪的换行符&…...

保姆级教程:手把手教你用Wireshark和IgH主站分析EtherCAT BRD报文(0x0130/0x0131)

工业现场实战:用Wireshark与IgH主站深度解析EtherCAT BRD报文 在工业自动化现场调试中,EtherCAT网络的稳定性直接关系到产线运行效率。当从站设备突然离线或主站报拓扑错误时,如何快速定位问题?本文将带你用Wireshark抓包工具和Ig…...

保姆级教程:手把手调试vsomeip 3.1.20.3的Event订阅流程(附GDB/日志追踪技巧)

深入调试vsomeip事件订阅:从原理到实战排查指南 事件订阅机制的核心原理 vsomeip作为车载中间件领域的核心通信框架,其事件订阅机制的设计直接影响着分布式系统的实时性和可靠性。理解这套机制的工作原理,是高效排查订阅问题的前提。 事件订阅…...

从数据手册到实测:英飞凌IM68A1308模拟硅麦在声音信标中的性能验证

1. 认识英飞凌IM68A1308模拟硅麦 第一次拿到IM68A1308这颗模拟硅麦时,我差点以为发错了货——它的尺寸比米粒还小,封装是典型的表贴式设计。这种微型麦克风在智能车竞赛的声音信标系统中扮演着关键角色,就像给赛车装上了"电子耳朵"…...

3大核心策略解锁抖音纯净内容:douyin-downloader深度解析与实战

3大核心策略解锁抖音纯净内容:douyin-downloader深度解析与实战 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...

别再傻傻分不清了!PyTorch中矩阵的⊕、⊙、⊗操作符与*、@、torch.mul()的保姆级对照指南

PyTorch矩阵操作符完全指南:从数学符号到代码实现 刚接触深度学习时,最让人头疼的莫过于论文中那些神秘的数学符号和实际代码之间的对应关系。⊕、⊙、⊗这些看似简单的符号,在PyTorch中到底该用、*还是?为什么有时候*能得到预期结…...

Mac上Python调用Wind量化接口的完整避坑指南

1. Mac上Wind量化接口的特殊性 第一次在Mac上配置Wind量化接口时,我踩了不少坑。和Windows不同,Mac上的Wind生态简直像两个平行世界。Windows用户点几下鼠标就能搞定的事情,在Mac上可能要折腾大半天。最让人崩溃的是,Mac版的Wind…...