8. Control Flow
Canonical Trees
Conditional Branches
- CJUMP(cond,l1,l2) 有条件跳转
- JUMP(l) 无条件
Basic Block
基本块划分
- 第一条语句是LABEL
- 最后一条语句是JUMP或者CJUMP
- 没有其他的LABEL,JUMP,CJUMP
划分算法: 按顺序扫描语句序列
- 如果是LABEL就开始
- 如果是JUMP或CJUMP 就结束当前块。下一条语句,和JUMP的目标语句都开始一个新的块 这样划分完之后,如果一个块开头没有LABEL,就加一个LABEL. 如果结尾没有JUMP/CJUMP, 就加一个JUMP到下一个块的LABEL
Trace
目标是将程序的基本块组织成一系列的迹 (traces)。一个迹是一个基本块序列,如果程序执行到达迹的第一个基本块,那么它会按照顺序执行迹中的所有基本块,直到遇到一个分支到迹外的基本块。

- 初始化: 将程序中的所有基本块放入一个列表
Q中。 - 循环直到所有块都被处理: 当
Q不为空时,执行以下操作:- 开始新的迹: 创建一个新的空迹
T。 - 选择起始块: 从
Q的头部移除一个基本块b。 - 跟踪当前迹: 只要当前块
b没有被标记(表示它还没有被包含在任何迹中):- 标记并添加到迹: 将
b标记为已处理,并将b添加到当前迹T的末尾。 - 检查后继块: 检查
b的所有后继块(即b分支到的块)。 - 选择未标记的后继块: 如果存在一个未被标记的后继块
c,则将b更新为c,继续跟踪该后继块。 - (所有后继块都已标记): 如果
b的所有后继块都已经被标记,则当前迹T结束。
- 标记并添加到迹: 将
- 迹已完成: 当内部的
while循环结束时,当前的迹T就生成完毕了。
- 开始新的迹: 创建一个新的空迹