常见数据流分析

  • 数据流分析
  • 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 : 数据流分析相关推荐

  1. LLVM数据流分析的理论

    LLVM数据流分析的理论 标量优化(scalar目录): 死代码消除(BDCE.cpp[code],ADCE.cpp[code],DCE.cpp[code]), 全局值编号(GVN.cpp[code] ...

  2. 国内android应用商城中程序隐私泄露分析,基于数据流分析的Android应用隐私泄露检测研究...

    摘要: 随着技术的进步,智能手机给人们的生活带来了极大的便利.据统计,搭载Android智能系统的手机现如今已经占据了 81%的手机市场份额,这也正让安卓系统成为了攻击者窃取用户隐私数据的一个重要目标 ...

  3. 静态程序分析chapter4 - 基于格(Lattice)理论的数据流分析

    文章目录 三. 格理论 函数不动点 偏序(Partial Order) 上界和下界 最小上界和最大下界 glb 和 lub的属性 格(lattice).半格.完备格.乘积格 数据流分析框架 单调性和不 ...

  4. 静态程序分析chapter3 - 数据流分析详述(Reaching Definitions、Live Variables、Available Expressions Analysis)

    文章目录 二. 数据流分析 introduction1 introduction2 输入和输出状态 转换函数 数据流分析应用 1,Reaching Definitions Analysis 概述 用途 ...

  5. 国内唯一,阿里云挺进 Forrester 数据流分析报告“强劲表现者”象限

    简介:Forrester 最新数据流分析报告:阿里云入选强劲表现者象限 日前,权威咨询机构 Forrester 发布了 2021 Q2 全球数据流分析报告,阿里云凭借领先的实时计算产品.开发者友好度和 ...

  6. 【编译原理笔记17】代码优化:数据流分析,到达定值分析,到达定值方程的计算

    本次笔记内容: 8-5 数据流分析 8-6 到达定值分析 8-7 到达定值方程的计算 本节课幻灯片,见于我的 GitHub 仓库:第17讲 代码优化_2.pdf 文章目录 数据流分析 数据流分析(da ...

  7. Android Camera数据流分析全程记录(overlay方式二)

     Android Camera数据流分析全程记录(overlay方式) 上一篇文章overlay这个过程已经走了一遍,但是根本是这个流程还没有走完,由上一篇文章知道,最后调用了postFrame方法, ...

  8. Android Camera数据流分析全程记录(overlay方式一)

     Android Camera数据流分析全程记录(overlay方式) 这里为什么要研究overlay方式呢?android camera需要driver和app层需要有大量数据需要传输,如果使用非o ...

  9. deepstream视频数据流分析工具包安装使用教程

    deepstream数据流分析工具包安装和使用 deepstream是nvidia官方推出的一个数据流处理工具包,可以很方便的实现对视频的解码.推理等工作,高效的完成图像分类.目标检测.识别和跟踪等任 ...

最新文章

  1. corosync+pacemaker实现高可用(HA)集群(二)
  2. 对当前JAVA流行框架的一些小感悟
  3. SDOI2015寻宝游戏 dfs序+set
  4. 【Linux 内核】进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )
  5. 跑monkey需要安装什么_安装隔音吊顶需要注意什么 隔音吊顶材料推荐
  6. php win2003 下载,64位windows2003iis安装包|《win2003 iis安装包》64位完整版附安装PHP教材...
  7. Exchange Server 2016管理系列课件46.DAG管理之Powershell创建DAG
  8. 拟态个人主页UI源码开源
  9. 《Reids 设计与实现》第十四章 集群(上)
  10. Linux ssh 配置
  11. WGS84 UTM 坐标系及UTM投影分带标准
  12. Mac Navicat Premium 12.1.13 破解版本下载
  13. day04-selenium滚动和常见反爬
  14. Pano2VR制作热区激活面板
  15. LOL聊天服务器一直是断开状态怎么办,lol聊天服务器为什么老连不上 lol聊天服务器连不上解决技巧...
  16. 服务器在线测速系统源码
  17. cad菜单栏快捷键_天正建筑菜单栏不见了怎么调出来
  18. 一篇文章看懂Facebook和新浪微博的智能FEED
  19. SSL协议与Nginx安装SSL模块和ssl证书
  20. coreldraw高级快捷键技巧

热门文章

  1. 【Pytorch】torch.backends.cudnn.benchmark 作用
  2. google earth engine (GEE)面向对象分类 代码
  3. sanicOpenApi 学习
  4. 2022“杭电杯”中国大学生算法设计超级联赛(7)1004 Triangle Game
  5. python中怎么随机从字典中取值_python怎样从字典中随机取数据
  6. SpringBoot下实现华为云短信验证功能(含代码)
  7. POJ1830 开关问题
  8. 基于Python的自制画板小工具
  9. English Summary~August
  10. 怎样将本地图片转换成网络链接图片