控制流分析(Control Flow Analysis)

控制流分析用于揭示程序的控制流结构,包括构建控制流图(CFG),识别循环,并为优化和数据流分析提供基础。基本块是分析的基础,由首领指令开始,单一入口和出口。扩展基本块在局部优化如指令调度中更有优势。通过CFA,可以进行区间分析和确定控制依赖,支持并行化等高级技术。

控制流(Control Flow):操作的序列

控制流分析(Control Flow Analysis):通过分析程序去发现每一过程内控制流层次结构。

控制流分析的原因

  • 控制流分析(CFA)能够帮助我们理解控制流图(control-flow graphs,CFG)的结构
  • 能够确定控制流图中的循环结构
  • 通过CFA获得的必经结点信息,为代码动作形成条件
  • SSA形式的构造
  • 通过CFA获得区间结构,来实现数据流分析
  • 寻找在并行化中所需要的控制依赖

控制流分析的方法

确定构造过程的基本块构造CFG,有如下两种途径:

  • 使用必经结点来找出循环,并为优化简单地标识出它所找到的循环
  • 区间分析(成熟变体:结构分析(对例程中的每一种控制流结构进行分类))

基本块

1、基本块(basic block):

一个只能从第一条指令进入,最后一条指令离开的最长指令序列。

2、构建基本块

先确定首领(leader):基本块的第一条指令

  1. 例程的入口点,或
  2. 分支的目标,或
  3. 直接紧跟在分支指令或返回指令之后的所有指令

3、构建基本块的算法

Input: List of n instructions(instr[i]=ith instruction)
Output: Set of leaders & list of basic blocks(block[x] is block with leader x)

//第一条指令是领导
leaders = {1}
for i = 1 to n  //找到所有的领导
	if instr[i] is a branch
		leaders = leaders U set of potential targets of instr[i]
for each xleaders
	block[x] = {x}
	i = x + 1     //补足第x个基本块
	while i<=n and ileaders
		block[x] = block[x] {i}
		i = i + 1

控制流图(CFG)

1、定义:有向图

 

注意:entry,exit基本块不是实质性的,引入是为了算法的描述简单

2、构造过程

  • 每一个CFG节点代表一个基本块
  • 节点i到j有边,若
  1. 基本块i的最后一条语句分支跳转到块j的第一条语句,或者
  2. 块i不是以无条件分支结束且块j直接跟在其后面

3、从基本块构造CFG算法

Input:A list of m basic blocks(block)
Output:A CFG where each node is a basic block

for i = 1 to n
	x = last instruction of block[i]
	if instr x is a branch
		for each target(to block j)of instr x
			create an edge from block i to block j
	if instr x is not an unconditional branch
		create an edge from block i to block i+1

例子(鲸书中的):

扩展基本块

1、扩展基本块(extended basic block):

从一个首领开始的最长指令序列,在这个指令序列中,除了第一个结点之外不含其他汇合结点

  • 只有一个入口且可能有多个出口(可看作以入口基本块为根的一棵树)
  • 某些局部优化(如指令调度)在扩展基本块上更加有效

2、算法

对以r为根的扩展基本块,构造其内诸基本快的索引集合

全局变量EbbRoots记录扩展基本块的根基本块

procedure Build_Ebb(r,Succ,Pred)
{
	Ebb = {}
	Add_Bbs(r,Ebb,Succ,Pred)
	return Ebb
}

procedure Add_Bbs(r,Ebb,Succ,Pred)
{
	Ebb = Ebb{r}
	for each xSucc(r) do
		if |Pred(x)|=1& xEbb then
			Add_Bbs(x,Ebb,Succ,Pred)
		else if xEbbRoots then
			EbbRoots = EbbRoots{x}
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值