静态分析技术-1 基本块与Control Flow Graph

一. CFG(Control Flow Graph)概览

CFG是一种编译过程中代码的表示形式,以图的形式表示代码的控制流信息。
CFG通常面向机器语言构建,因为机器语言每条语句较为简单,其控制流绘制起来更为清晰,下图即为一个简单的控制流图示例(图片来自DCC888课件):可以简单的看到,控制流图的每个节点内部可能包含多个指令,这些指令顺序执行,当发生分支跳转时,就需要进入另外一个节点。
控制流图示例

二. 基本块与CFG的定义

2.1 基本块

基本块由一系列的语句组成,这些语句具有如下特点

  • 整个程序的在执行指令时只能从第一条语句进入该基本块,不能够以某种方式跳入该基本块的中间
  • 基本块内的语句在执行时必须从最后一条语句离开,不能够执行到一半跳转到其它的基本块
    从上述两个条件能够看出,基本块可以理解为一系列顺序执行不做跳转的语句,一旦语句发生跳转行为,则进入另一个基本块,该基本块结束。

2.2 CFG

CFG是一个由基本块组成的有向图

  • 每个节点都是一个基本块
  • 如果程序的执行路径可能从一个基本块B1进入另一个基本块B2B1有一条指向B2的边。

2.3 识别基本块的算法

定义每个基本块的第一条语句为Leader
按照如下步骤即可识别出一段程序中的Leader语句

  1. 程序的第一条语句为Leader
  2. 任何一个跳转语句的目标点都是一个Leader
  3. 任何一条跳转语句的下一条语句都是一个Leader

对程序每一条语句顺序扫描,标出其中的Leader语句,再从第一条语句开始,每条语句都加入当前的基本块,直到遇到一个Leader语句,则该基本块结束,开始一个新的基本块。

三. 基于基本块的编译优化

基于基本块的编译优化称为Local Optimization,基于整个程序的编译优化称为Global Optimization,虽然在编译优化中较少用到Local Optimization,但是其原理和其它的优化是相通的。

3.1 基本块表示为DAG有向无环图

由于基本块内部不存在指令跳转,因此基本块可以表示为DAG形式,从而在DAG上做一些更直观的优化操作DAG的定义如下:

  • 对于每一个直接出现在基本块中的变量,定义其为input value,对应一个节点
  • 对于每条语句,对应一个node
  • 如果语句S1使用了语句S2Sn定义的变量,则分别有边从S2Sn指向S1
  • 对于在基本块中没有再次使用的变量,定义为output value

下面给出一个DAG的示意图(图来自DCC888课件)
DAG示意图
图中语句2b进行了新的赋值,因此语句3用的是语句2定义的变量b

3.2 公共子表达式(Local Common Subexpression)

在代码的运行过程中,可能有几条语句所公用了某个表达式,为了更高效的计算,可以将其公共的表达式提取出来,计算一次,多次使用,例如下面的代码:

a = b + c
b = a - d
c = b + c  /* b+c表达式第二次出现*/
d = a - d

在构建DAG的过程中,只要经过一个简单的优化,就可以获取Local Common Subexpression
只要将构建DAG时每条语句构建一个节点 替换成针对之前未出现过的语句构建新的节点,否则则将该语句用指针指向之前出现的语句 即可,具体来说如下:

for v0=f(v1,v2...) in all statement:  //一次遍历每一条语句
	v0_sig = Hash(f(v1, v2....))//对于右侧的v和运算符组成的序列计算特征值,来表示V0
	                               //v0_sig用每一个v1_sig和运算符计算得到                            
	if(v0_sig 出现过):
		v0_sig 新建一个节点,指向该Hash相同的节点
	else
		正常新建节点

示例如下:
公共子表达式示例

3.3 死代码消除(Dead Code)

程序中部分代码是不会被执行到的,但是其占用地址空间,降低程序可读性,因此可以通过优化消除Dead Code
在DAG中,如果一个output value在之后不会使用到(需要用到基本块间的关系),则该值得计算是没有意义的,可以去除计算该值的语句,但是需要注意,去除一条语句的同时可能会产生新的output value,因此该过程需要递归进行。
示例入下:如果d,或者c在之后不会被用到,则分别可以进行如下的消除。
死代码消除

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值