控制流(Control Flow):操作的序列
控制流分析(Control Flow Analysis):通过分析程序去发现每一过程内控制流层次结构。
控制流分析的原因:
- 控制流分析(CFA)能够帮助我们理解控制流图(control-flow graphs,CFG)的结构
- 能够确定控制流图中的循环结构
- 通过CFA获得的必经结点信息,为代码动作形成条件
- SSA形式的构造
- 通过CFA获得区间结构,来实现数据流分析
- 寻找在并行化中所需要的控制依赖
控制流分析的方法
确定构造过程的基本块构造CFG,有如下两种途径:
- 使用必经结点来找出循环,并为优化简单地标识出它所找到的循环
- 区间分析(成熟变体:结构分析(对例程中的每一种控制流结构进行分类))
基本块
1、基本块(basic block):
一个只能从第一条指令进入,最后一条指令离开的最长指令序列。
2、构建基本块
先确定首领(leader):基本块的第一条指令
- 例程的入口点,或
- 分支的目标,或
- 直接紧跟在分支指令或返回指令之后的所有指令
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有边,若
- 基本块i的最后一条语句分支跳转到块j的第一条语句,或者
- 块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}
}
控制流分析用于揭示程序的控制流结构,包括构建控制流图(CFG),识别循环,并为优化和数据流分析提供基础。基本块是分析的基础,由首领指令开始,单一入口和出口。扩展基本块在局部优化如指令调度中更有优势。通过CFA,可以进行区间分析和确定控制依赖,支持并行化等高级技术。
1715

被折叠的 条评论
为什么被折叠?



