1.基本块(Basic Block)和流图(flow graph)
将一段程序划分为基本块(Basic Block BB),每个基本块满足以下条件:
a) 控制流只能从基本块的第一个指令进入;
b)除了基本块的最后一条指令,控制流在离开基本块前不会停止或跳转。
构造基本块的详细条件:
1)每一个基本块只有一个入口一个出口;
a)可能是入口的几种情况:
程序的第一个语句
跳转的目标语句
条件跳转的下一条语句
b)可能是出口的几种情况:
停机语句
跳转语句
跳转目标语句的前一个语句
构建基本块的算法:
1. 确定程序的leaders(就是确定基本块的入口):
- 程序的第一条指令是一个leader;
- 有条件或无条件跳转的目标指令是leaders;(如果不是则会有两个入口)
- 任何紧跟在有条件和无条件跳转之后的指令是leaders。(如果不是则会有两个出口)
- BB由一条leader及其所有后续指令组成,直到下一条leader。
例子:
程序的第一条指令是x=input,所以它是leader;
有条件或无条件跳转的目标指令 a= q,return,z = x*y是leader
任何紧跟在有条件或无条件跳转之后的指令p = x/y,goto B2是leader
最后,BB由一条leader及其所有后续指令组成,直到下一条leader。
例子:
流图是由一个个基本块构建的,流图的边表示了哪些基本块可能在一个基本块之后执行:上述图例也表示一个流图。
在程序被划分为基本块后,将基本块视为一个基本单元节点,基本块之间在程序执行流程上互为前驱和后继关系,可视为两个基本块之间是一个有向图,称为控制流图(control flow Graph,CFG)