程序依赖相关知识点(PDG,SDG)

news2024/11/25 4:44:17

什么叫可达性

变量v的定义d:对变量v的赋值语句称为变量v的定义

变量v的使用:在某个表达式中引用变量v的值

当变量v被再次赋值时,上一次赋值对变量v的定义d就被kill掉了

如果定义d到点p之间存在一条路径,且在路径中定义d没有被kill掉,则称d可以到达p

如下图所示,d可以通过path2到达u但是不能通过path1到达u,因为k这条语句kill掉了定义d。而因为d到u之间存在着没有被kill的路径path2,所以d可以到达u。

X = . 叫做精确定义,*p = . 叫做模糊定义,因为p可能指向X,一般考虑可达性只考虑精确定义对路径的kill。

数据依赖

两个句子存在数据依赖:一条语句中一个变量的定义,可以到达另一条语句中对该变量的使用

在编译领域有不同类型的数据依赖,如果我们说s2依赖于s1,可以是:

  1. s1 写内存 s2 读 (RAW)
  2. s1 读内存 s2 写 (WAR)
  3. s1 写内存 s2 写 (WAW)
  4. s1 读内存 s2 读 (RAR)

在软件工程领域,主要关注RAW依赖,在源码或IR的层度上。

DU-chains: def-use chains 优点是可以快速得到数据依赖,缺点是必须不断计算和更新,空间开销大。将每个语句作为结点,箭头作为有向边,即可得到数据依赖图。

SSA:static single assignment 每一次赋值都由一个不同的变量表示,优点是使得分析变得简单高效,缺点是需要添加额外的条件才能正确执行,时空开销大。

如下图所示,转换为SSA就是使得每个变量只有一次定义。转换过程有两个步骤,分别为对每一个定义重命名,和对所有定义能到达的使用重命名。

PDG:程序依赖图

程序依赖图的结点代表语句,边代表依赖关系,这里的依赖关系包括数据依赖和控制依赖

数据依赖:

s1: A = B * C;
s2: D = A * E + 1
由于s1语句变量A在s2语句中被读,因此称s2数据依赖于s1

控制依赖:

s1: if (A) then
s2:  B = C * D
    endif
由于s1语句变量A的值决定了s2语句是否被执行,因此称s2控制依赖于s1

其中控制依赖用实箭头表示,数据依赖用虚箭头表示。构建PDG图的整体流程如下。

首先做出其控制流图,从中找到控制依赖图和数据依赖图,结合起来即得到PDG图。数据依赖图上面已经说过了,控制依赖图由控制流图和FDT(Forward dominance Tree)产生。

FDT就是前向支配树,那么什么是支配树呢?编译原理里面有这样的一个概念,如果每一条从流图的入口结点到结点n的路径都经过结点d, 我们就说d支配(dominate)n,记为d dom n。请注意,在这个定义下每个结点都支配它自己如下图所示,左侧为流图,右侧为其对应的支配树。

在支配树(dominator tree)中,对于结点n来说,从根节点到结点n所在路径上的结点都严格支配结点n,例如上图中从根节点1 -> 2 -> 3,其中结点1和结点2都严格支配结点3。该路径上离结点n最近的结点叫做结点n的直接支配结点(immediate node),用IDom(n)表示,例如上图中IDom(6) = 2。

前向支配树(FDT)指的就是根节点为函数出口的支配树,也就是上图的翻转,如下图所示,右侧为左侧函数对应的FDT(比如5->2的箭头表示,所有从函数出口到2的路径都一定会经过5,因此5是2的主导):

于是,得到FDT后将其与控制流图结合即可得到控制依赖图如下,有了控制依赖图,加上之前的数据依赖图,集合起来就得到了程序依赖图PDG。

SDG:系统依赖图

系统依赖图,顾名思义,在PDG的基础上增加了一些点和边将整个系统整合在一起表示,对于系统中主函数的依赖图称为program dependence graph,对于其余函数称为procedure dependence graphs。

SDG中增加了5类新的结点:1)调用点 2)actual-in结点:它是具有与调用点相关的控制依赖,将实参的值传入一个临时单元中(例如x_in) 3) actual-out结点:也是具有与调用点相关的控制依赖,将临时单元中的值返回给实参 4)formal-in结点:它是具有与被调函数入口相关的控制依赖,将临时单元中的值复制给形参 5)formal-out结点:也是具有与被调函数入口相关的控制依赖,将形参中的值返回给临时单元

SDG中增加了3类新的边:1)从调用点指向被调函数入口结点的边 2)parameter-in边:actual-in结点指向formal-in结点的边(相当于实参->临时单元->形参) 3)parameter-out边: formal-out结点指向actual-out结点的边(相当于上述过程的返回过程)

一个SDG图的例子如下:

生成SDG的步骤:

1)首先先生成主函数的program dependence graph,和所有被调函数的procedure dependence graphs

2)对于每一个调用点,添加一条边指向被调函数的入口点

3)对于在调用点处的每一个actual-in的结点,添加一条parameter-in的边,指向被调函数对应的formal-in的结点

4)对于在调用点处的每一个actual-out的结点,添加一条parameter-out的边,由被调函数对应的formal-out的结点所指向

参考文献:

【1】Ferrante J, Ottenstein K J, Warren J D. The program dependence graph and its use in optimization[J]. ACM Transactions on Programming Languages and Systems (TOPLAS), 1987, 9(3): 319-349.

【2】Sinha S, Harrold M J, Rothermel G. System-dependence-graph-based slicing of programs with arbitrary interprocedural control flow[C]//Proceedings of the 1999 International Conference on Software Engineering (IEEE Cat. No. 99CB37002). IEEE, 1999: 432-441.

【3】Tip F. A survey of program slicing techniques[M]. Amsterdam: Centrum voor Wiskunde en Informatica, 1994.

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

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

相关文章

Java 多线程系列Ⅵ(并发编程的五大组件)

JUC 组件 前言一、Callable二、ReentrantLock三、Atomic 原子类四、线程池五、Semaphore六、CountDownLatch 前言 JUC(Java.util.concurrent)是 Java 标准库中的一个包,它提供了一组并发编程工具,本篇文章就介绍几组常见的 JUC 组…

汇川PLC学习Day2:编写检测IO端口状态程序

汇川PLC学习Day2:编写检测IO端口状态程序 一、 新增IO和模拟量模块 IO组态界面 模块参数设置 程序编写 想法是将DA模块的通道0接到AD模块的通道0,将DA模块的通道1接到AD模块的通道1,PLC本身发模拟量给自己PLC收模拟量转换,…

MySQL 8.0.25版本下载、安装及配置(Windows 10/11 64位)详细教程【超详细,保姆级教程!!!】

本文介绍关于windows 11如何安装配置MySQL 8.0.25版本的详细步骤 MySQL下载地址(官网) 一、下载MySQL 8.0.25 1、进入官网,选择版本 8.0.25 2、下载MySQL压缩包 3、下载完成后将压缩包解压至方便自己查找的位置(切记&#xf…

Tensor数据转换为稀疏矩阵

Tensor数据转换为稀疏矩阵 一、稀疏矩阵 原文链接 常用的稀疏矩阵存储格式有COO,CSR/CSC,LIL 1.COO COO(Coordinate format )是最为简单的格式,以三元组的形式存储稀疏矩阵。记录矩阵中非零元素的数值和所在的行序号和列序号。形式为&am…

工商业储能CE认证电表ADW300

安科瑞 华楠 ADW300 无线计量仪表主要用于计量低压网络的三相有功电能,具有体积小、精度高、功能丰富等优点,并且可选通讯方式多,可支持 RS485 通讯和 Lora、NB、4G、wifi 等无线通讯方式,增加了外置互感器的电流采样模式&#x…

【数据结构】线性表

线性表 顺序表链式存储单链表双链表 知识目录 顺序表 概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。 特点:逻辑上相邻的数据元素,物理次序也是相邻的。 只要确定好了存储线性表的…

基本数据类型和包装类型 使用规范

使用规范 1 概念1.1 基本数据类型1.2 包装类型1.3 对应关系1.4 自动装箱/拆箱 2 变量类型2.1 全局变量2.1.1 常量(Constants)2.1.2 类变量(Class Variables)2.1.3 实例变量(Instance Variables) 2.2 局部变…

快速实现抖音上下滑动,你不知道的ViewPager2用法,信息量巨大,建议收藏点赞。老tier~

万能ViewPager2适配器–SmartViewPager2Adapter 特点功能 完全脱离xml,所有效果只需要通过api调用 具体功能:1. 两句代码实现抖音列表效果2. 无感且丝滑,动态从头部或者底部加载数据3. 设置上下加载监听,再达到预加载limit的时…

用python实现基本数据结构【02/4】

*说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…

STM32初学-外部RTC时钟芯片DS3231

RTC(Real_Time Clock)即实时时钟,它是电子产品中不可或缺的东西。其最直接的作用就是时钟功能。细心的朋友可以发现,当我们的电脑或者手机没联网时,仍然可以正常显示日期与时钟,这就是RTC的功劳。 RTC的运行无需网络连接&#xff…

python创建exe文件

1、搭建环境 pip install pyinstaller 2、准备测试代码 exe_test.py import timeprint("hello") print("hello") print("hello") print("hello")time.sleep(5) 注:添加sleep以便在执行exe文件的时候能看到结果 3、生…

在Windows操作系统上安装PostgreSQL数据库

在Windows操作系统上安装PostgreSQL数据库 一、在Windows操作系统上安装PostgreSQL数据库 一、在Windows操作系统上安装PostgreSQL数据库 点击 PostgreSQL可跳转至PostGreSQL的官方下载地址。 (1) (2)选择安装的目录&#xff…

入门人工智能 —— 使用 Python 进行文件读写,并完成日志记录功能(4)

入门人工智能 —— 使用 Python 进行文件读写(4) 入门人工智能 —— 使用 Python 进行文件读写打开文件读取文件内容读取整个文件逐行读取文件内容读取所有行并存储为列表 写入文件内容关闭文件 日志记录功能核心代码:完整代码:运…

小工具——筛选图像小工具

最近在公司手动筛图片,需要将某些含有检测目标的图像手动筛选出来用于做新模型的测试。我最开始是两个文件夹,来回复制粘贴,后来感觉这种效率太低了,就随手写了一个图像筛查小工具。代码如下: import sys from PyQt5.…

图论-图的深度优先遍历-Java

回顾力扣144/94//145/102/589/590/429,熟练掌握递归和非递归写法。 图论不强调非递归。 使用邻接表 1个连通分量 Graph.java package Chapt02_DFS; import java.io.File; import java.io.IOException; import java.util.TreeSet; import java.util.Scanner;///…

66.C++多态与虚函数

目录 1.什么是多态 2.多态的分类 3.对象转型 3.1 向上转型: 3.2 向下转型: 4.虚函数 1.什么是多态 生活中的多态,是指的客观的事物在人脑中的主观体现。例如,在路上看到⼀只哈士奇,你可以看做是哈士奇&#xf…

Unity实战(10):如何将某个相机的画面做成贴图(RenderTexture)

目录 前言 一、创建物体、材质与相机 二、将RenderTexture赋给材质 2.1 修改rt1的一些属性 2.2 将rtMat1材质的shader改为Unlit/Texture,并将rt1赋给这个材质 三、效果呈现 前言 本文记录如何将某个相机的画面做成贴图,即游戏某些场景中小地图做法…

时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测

时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测 目录 时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 ICEEMDAN-iMPA-BiLSTM功率/风速预测 基于改进的自适应经验模态分解改进海洋捕食者算法双向长短期记忆…

基于SSM的农产品推广应用网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

华为云云耀云服务器L实例评测|centos系统搭建git私服

搭建git私服 前言一、云服务器二、服务器安装git三、服务器git配置1.创建文件用于存放公钥2.设置文件权限3.配置本地公钥 四、服务器部署git仓库四、git仓库到本地总结 前言 之前一直想搭建一个属于自己的git私服,然后没赶上厂商的活动,这次正好赶上华为…