DC888 : 数据流分析
常见数据流分析
- 数据流分析
- Liveness
- 活跃性分析定义
- 1.2 数据流分析方程
- 1.3 用途
- 2 Available Expressions
- 2.1 概念定义
- 2.2 数据流方程
- 2.3 分析用途
- 3 Very Busy Expressions
- 3.1 概念定义
- 3.2 数据流方程
- 3.3 分析用途
- 4 Reaching Definitions 定值到达分析
- 4.1 概念定义
- 4.2 数据流方程
- 4.3 用途
- 总结
本文旨在总结常见数据流分析:活跃性(liveness)分析,常用表达式(Available Expressions)分析,very busy 表达式(VeryBusy Expressions)分析,定值到达(Reaching Defs)分析,文章中的各类概念定义并不是严格定义,主要是帮助自己理解。
数据流分析
数据流分析是编译器,程序分析,垃圾回收等技术的公共基础,数据流分析的直觉感受可以认为是,在程序的控制流图上(CFG),将每条语句视为CFG上的节点(又叫程序点),计算出节点前后的数据流信息(liveness, Reaching Defs,VeryBusy Expressions,Available Expressions)的情况,即节点前驱或后继的边上的信息,仿佛数据流信息在CFG上的边上“流动“”。值得注意的是每种数据流分析重要的关注点有以下共同几点:
1 . 转移函数 (transfer function): 表示节点前后数据流信息关系的方程
2 . 汇集函数(Merging Function): 在程序分支点(条件语句,while语句)(convergence)前后的数据流信息的关系
3. 迭代分析方向,前向或者后向
4 . 算法初始值
Liveness
活跃性分析定义
if a variable is used at a program point p, then it must be alive immediately before p.
翻译:一个变量v在程序点p使用,那么在程序点p之前,它都是活跃的。
补充理解:
一个变量v从定义点到使用点,只要中间没有重定义x,x的生命周期就是定义点到使用点,
示例代码:
var x,y,z;
x = 2; (定义点)
...... // n条语句,但不包括对x的赋值语句
z = x-4; (使用点)
//在使用点之前,x一定是活跃的,变量的生命周期从def到use,是左开右闭(def,use].
1.2 数据流分析方程
p : v = E
IN ( p )= ( OUT( p ) \ {v} ) ∪ vars(E) (transfer function)
OUT( p ) = ∪ IN(psp_sps), psp_sps∈ succ( p ) (merging function)
IN ( p ) : 经过程序点之前活跃变量的集合
OUT( p ) :经过程序点之后活跃变量的集合
vars(E) :表达式中使用的变量
succ( p ):在CFG中,程序点p的后继节点
解释:
(1)每个程序点有两个集合, IN ( p ) 和OUT ( p) ,代表了经过程序点之前和之后活跃变量的集合。
(2)转移函数:
首先从等式可以看出,它是从OUT信息推出IN信息,所以它是一个Backward(后向)分析,
另外,等式中的差运算 {v},表示等式左边的{v},
活跃性在程序点p杀死了,需要删除(kill);并运算vars(E),程序点右边表达式使用的变量,在程序点之前一定是活跃的(Gen),
所以加入集合IN( p )。
(3)汇集函数:
汇集函数对于后向分析,比较关注多个后继节点IN ( p ) 对该节点OUT( p)的影响,
因为liveness它是一个may的信息,所以汇集函数使用并运算。
1.3 用途
活跃性分析最重要的一个优化就是寄存器分配,该优化关心每个变量的生命周期,从体系结构最基本的知识,我们知道寄存器是处理器上读写速度最快的资源,寄存器分配要确保最经常使用的变量放在寄存器,不经常使用的放入内存。
活跃性分析,可以编译报错阶段,找到未定义的变量,输出debug信息。
DC888的个人相关理解:
(1)为什么liveness analysis是Backward(后向)分析(input数据从output而来),是因为每一个node需要看其后面是否使用,如果使用则是liveness,否则就是dead。
(2)如果是有向有环图,第一次算的不正确,需要多次以后计算,每个点的input和output值不变,方为liveness最终结果,fix point。
2 Available Expressions
2.1 概念定义
if an expression is used at a point p, then it is available immediately after p, as along as p does not redefine any the variables that the expression uses.
翻译:如果一个表达式在程序点p使用(出现),那么在程序点p以后,它都是可用的,只要程序点p没有重定义表达式使用的变量。
补充理解:
如果一个表达式在多个程序点出现,我们自然会想到,它们是不是相同的,因为如果是相同的话,只需计算一次表达式的值,后面的程序点直接使用该值就可以了。如下面的例子,程序点1,2,3都用了相同的表达式(a+b), 唯一的区别就是程序点12之间没有更改表达式里面变量的值,而程序点23之间,变量a的值改变了.
示例代码:
var x,y,z,a,b;
x = a+b; // 程序点 1
y = a*b;
if (y > a+b){ // 程序点 2a = a+1x = a+b; // 程序点 3
}
2.2 数据流方程
p : v = E
OUT( p ) = (IN( p ) ∪ { E } ) \ {Expr(v)} (tranfer function)
IN( p ) = ∩ OUT(psp_sps), psp_sps ∈ pred( p ) (merging function)
IN ( p ) : 经过程序点之前可用表达式(available expressions)集合
OUT( p ) :经过程序点之后可用表达式(available expressions)集合
Expr(v) :含变量v的可用表达式集合
pred( p ):在CFG中,程序点p的前驱节点
解释:
转移函数:
(1)首先从等式可以看出,它是从IN 信息推出OUT信息,所以它是一个Forward(前向) 分析。
(2)并运算 {E} , 表示程序点使用的表达式需要加入集合;等式中的差运算Expr(v),表示,需要删除(kill)含变量v的可用表达式;
汇集函数:
汇集函数对于前向分析,比较关注多个前驱节点的OUT ( p)对该节点的IN ( p ) 的影响,
因为Available Expression它是一个Must的信息,所以汇集函数使用交运算。
2.3 分析用途
条件表达式分析之后的优化可以做一些表达式化简相关的操作。
个人理解:一个变量的liveness是需要看其终点在哪里,而available expression则是当前可获取复用的expression有哪些。available expression是个前行分析,所以每次input需要看前驱所有节点可以传递过来的可获取复用的表达式有哪些。(注意这里是前驱output的交集)
3 Very Busy Expressions
3.1 概念定义
if an expression E is very busy at a program point if it will be computed before the program terminates along any path that goes from that point to he end of the program.
如果表达式E在程序点非常繁忙,如果它将在程序结束之前沿着从该点到程序结束的任何路径被计算。
补充理解:
非常忙(verybusy)表达式是可用表达式一种特殊情况,当某个表达式在控制流图的各个分支中都有出现,我们针对这个表达式做一些化简操作,但是如何得到这个VeryBusy的表达式呢?
从后向前倒退出各个程序点前后的可用表达式信息,如果在各个分支都有出现的表达式,后面就可以做优化操作,强调一下,Verybusy分析,只是从后往前分析出各程序点的可用表达式,判断是否在各分支都有,不是Verybusy表达式数据流分析的工作。
示例代码:
var x,a,b;
x = input;
a = x-1;
b = x-2;
while(x>0){print a*b-x; //程序点1: a*bx = x-1;
}
print a*b; //程序点2: a*b
3.2 数据流方程
p : v = E
IN( p ) = ( OUT( p ) \ {Expr(v)} ) ∪ { E } (transfer function)
OUT( p ) = ∩ IN(psp_sps), psp_sps∈ succ( p ) (merging function)
IN ( p ) : 经过程序点之前非常忙表达式(very busy expressions)集合
OUT( p ) :经过程序点之后非常忙表达式(very busy expressions)集合
succ( p ):在CFG中,程序点p的后驱节点
Expr(v) :含变量v的Verybusy表达式集合
解释:
转移函数:
首先从等式可以看出,它是从OUT 信息推出IN信息,所以它是一个Backward(后向) 分析。
另外,等式中的差运算Expr(v),表示,需要删除(kill)含变量v的非常忙表达式;并运算 {E} , 表示程序点使用的表达式需要加入集合;
汇集函数:汇集函数对于后向分析,比较关注多个后继节点IN ( p ) 对该节点OUT( p )的影响,
因为Available Expression它是一个Must的信息,所以汇集函数使用交运算。值得注意的是条件表达式也是表达式,需要加入计算,而活跃性分析与定制到达分析只关心define的表达式,不包含条件表达式计算。
3.3 分析用途
可用表达式和非常忙表达式分析都是关注于表达式是否可化简, 差别在于一个是前向分析,一个是后向分析。
4 Reaching Definitions 定值到达分析
4.1 概念定义
if a program point p defines a variable v, then v reaches the point immediately after p.
如果程序点p定义了一个变量v,那么变量v的定义可以到达p以后的程序点。
补充理解:
对变量的赋值在编译器术语中又叫定值,在赋值号右边的变量叫变量的使用,定值到达分析,关心赋值语句有没有到达它的使用点, 例如下面的代码片段,x的定义有两个点,我们比较关心到底哪个的赋值语句,才是真正对use有用的。
示例代码:
var x,y,z;
x = 2; (定义点1)
...... // n条语句,但不包括对x的赋值语句
x = 4; (定义点2)
...... // n条语句,但不包括对x的赋值语句
z = x-4; (使用点)
4.2 数据流方程
p : v = E
OUT( p ) = (IN( p ) \ {defs(v)} ) ∪ { (p,v) } (tranfer function)
IN( p ) = ∪ OUT(psp_sps), psp_sps ∈ pred( p ) (merging function)
IN ( p ) : 经过程序点之前到达定值(reaching-defs)集合
OUT( p ) :经过程序点之后到达定值(reaching-defs)集合
defs(E) :表达式中的到达定值,
pred( p ):在CFG中,程序点p的前驱节点
解释:
每个程序点有两个集合, IN ( p ) 和OUT ( p) ,代表了经过程序点之前和之后到达定值的集合。
转移函数:
首先从等式可以看出,它是从IN 信息推出OUT信息,所以它是一个Forward(前向) 分析。
另外,等式中的差运算 {v},表示等式左边的{v}的到达定值在程序点p杀死了,需要删除(kill);
并运算{p} ,程序点新生成的defs需要加入集合,这里有个小技巧,直接将defs等价于程序点,所以是并运算程序点。
汇集函数:
汇集函数对于前向分析,比较关注多个前驱节点的OUT ( p)对该节点的IN ( p ) 的影响,
因为Available Expression它是一个may的信息,所以汇集函数使用并运算。
4.3 用途
小结:
到达定值和活跃性分析,感觉上似乎很像,但是这两个分析从实例代码可以看出,它们的关注点是不同的,活跃性关心,变量从使用点,倒推回定义点,关心这个变量的生命周期;而定值到达分析,关心程序点的defs可以走多远。
到达定值分析可以做一些死代码删除,不过值得提出的是,在程序中间表示有SSA形式以后,活跃性分析和定值到达分析直接在ssa形式上表现出来了.
总结
backward : Out[S3] = (In[S4], In[S5], In[S6])
forward: IN[S4] = Out[S3]
DC888 : 数据流分析相关推荐
- LLVM数据流分析的理论
LLVM数据流分析的理论 标量优化(scalar目录): 死代码消除(BDCE.cpp[code],ADCE.cpp[code],DCE.cpp[code]), 全局值编号(GVN.cpp[code] ...
- 国内android应用商城中程序隐私泄露分析,基于数据流分析的Android应用隐私泄露检测研究...
摘要: 随着技术的进步,智能手机给人们的生活带来了极大的便利.据统计,搭载Android智能系统的手机现如今已经占据了 81%的手机市场份额,这也正让安卓系统成为了攻击者窃取用户隐私数据的一个重要目标 ...
- 静态程序分析chapter4 - 基于格(Lattice)理论的数据流分析
文章目录 三. 格理论 函数不动点 偏序(Partial Order) 上界和下界 最小上界和最大下界 glb 和 lub的属性 格(lattice).半格.完备格.乘积格 数据流分析框架 单调性和不 ...
- 静态程序分析chapter3 - 数据流分析详述(Reaching Definitions、Live Variables、Available Expressions Analysis)
文章目录 二. 数据流分析 introduction1 introduction2 输入和输出状态 转换函数 数据流分析应用 1,Reaching Definitions Analysis 概述 用途 ...
- 国内唯一,阿里云挺进 Forrester 数据流分析报告“强劲表现者”象限
简介:Forrester 最新数据流分析报告:阿里云入选强劲表现者象限 日前,权威咨询机构 Forrester 发布了 2021 Q2 全球数据流分析报告,阿里云凭借领先的实时计算产品.开发者友好度和 ...
- 【编译原理笔记17】代码优化:数据流分析,到达定值分析,到达定值方程的计算
本次笔记内容: 8-5 数据流分析 8-6 到达定值分析 8-7 到达定值方程的计算 本节课幻灯片,见于我的 GitHub 仓库:第17讲 代码优化_2.pdf 文章目录 数据流分析 数据流分析(da ...
- Android Camera数据流分析全程记录(overlay方式二)
Android Camera数据流分析全程记录(overlay方式) 上一篇文章overlay这个过程已经走了一遍,但是根本是这个流程还没有走完,由上一篇文章知道,最后调用了postFrame方法, ...
- Android Camera数据流分析全程记录(overlay方式一)
Android Camera数据流分析全程记录(overlay方式) 这里为什么要研究overlay方式呢?android camera需要driver和app层需要有大量数据需要传输,如果使用非o ...
- deepstream视频数据流分析工具包安装使用教程
deepstream数据流分析工具包安装和使用 deepstream是nvidia官方推出的一个数据流处理工具包,可以很方便的实现对视频的解码.推理等工作,高效的完成图像分类.目标检测.识别和跟踪等任 ...
最新文章
- corosync+pacemaker实现高可用(HA)集群(二)
- 对当前JAVA流行框架的一些小感悟
- SDOI2015寻宝游戏 dfs序+set
- 【Linux 内核】进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )
- 跑monkey需要安装什么_安装隔音吊顶需要注意什么 隔音吊顶材料推荐
- php win2003 下载,64位windows2003iis安装包|《win2003 iis安装包》64位完整版附安装PHP教材...
- Exchange Server 2016管理系列课件46.DAG管理之Powershell创建DAG
- 拟态个人主页UI源码开源
- 《Reids 设计与实现》第十四章 集群(上)
- Linux ssh 配置
- WGS84 UTM 坐标系及UTM投影分带标准
- Mac Navicat Premium 12.1.13 破解版本下载
- day04-selenium滚动和常见反爬
- Pano2VR制作热区激活面板
- LOL聊天服务器一直是断开状态怎么办,lol聊天服务器为什么老连不上 lol聊天服务器连不上解决技巧...
- 服务器在线测速系统源码
- cad菜单栏快捷键_天正建筑菜单栏不见了怎么调出来
- 一篇文章看懂Facebook和新浪微博的智能FEED
- SSL协议与Nginx安装SSL模块和ssl证书
- coreldraw高级快捷键技巧
热门文章
- 【Pytorch】torch.backends.cudnn.benchmark 作用
- google earth engine (GEE)面向对象分类 代码
- sanicOpenApi 学习
- 2022“杭电杯”中国大学生算法设计超级联赛(7)1004 Triangle Game
- python中怎么随机从字典中取值_python怎样从字典中随机取数据
- SpringBoot下实现华为云短信验证功能(含代码)
- POJ1830 开关问题
- 基于Python的自制画板小工具
- English Summary~August
- 怎样将本地图片转换成网络链接图片