1 划分四元式程序为基本块的算法
- 从四元式序列确定满足以下条件的入口语句:
(1)四元式序列的第一个语句
(2)能由条件转移语句或无条件转移语句转移到的语句
(3)紧跟在条件转移语句后面的语句
- 确定满足以下条件的出口语句
(1)下一个入口语句的前导语句
(2)转移语句(包括转移语句自身)
(3)停语句(包括停语句自身)
- 凡未被纳入某一基本块中的语句,可以从程序中删除
2 DAG
2.1 四元式的DAG表示

2.2 基本块仅含0、1、2型四元式的DAG算法
2.2.1 规定
- 大写字母——表示四元式中的变量名(或常数)
- Node(A)——A在DAG中的相应结点,结点值可为n或者无定义
2.2.2 文字叙述
- (1)若Node(B)无定义,则构造一标记为B的叶结点并定义Node(B)为这个结点,然后根据下列情况做不同处理:
① 若当前四元式是0型,则记Node(B)的值为n,转(4)
② 若当前四元式是1型,则转(2)①
③ 若当前四元式是2型,则:
<1> 如果Node©无定义,则构造一标记为C的叶结点,并定义Node©为这个结点;
<2> 转(2)②
- (2)
① 若Node(B)是以常数标记的叶结点,则转(2)③,否则转(3)①。
② 若Node(B)和Node©都是以常数标记的叶结点,则转(2)④,否则转(3)②。
③ 执行op B(即合并已知量),令得到的新常数为P。
<1> 若Node(B)是处理当前四元式时新建立的结点,则删除它;
<2> 若Node§无定义,则构造一用P做标记的叶结点n并置Node§=n;
转(4)
④ 执行B op C(即合并已知量),令得到的新常数为P。
<1> 若Node(B)或Node©是处理当前四元式时新建立的结点,则删除它;
<2> 若Node§无定义,则构造一用P做标记的叶结点n并置Node§= n;
转(4)。
- (3)
① 检查DAG中是否有标记为op且以Node(B)为唯一后继的结点(即查找公共子表达式)。
<1> 若有,则把已有的结点作为它的结点并设该结点为n;
<2> 若没有,则构造一个新结点;
转(4)。
② 检查DAG中是否有标记为op且其左后继为Node(B)、右后继为Node©的结点(即查找公共子表达式)。
<1> 若有,则把已有的结点作为它的结点并设该结点为n;
<2> 若没有,则构造一个新结点;
转(4)。
- (4) 若Node(A)无定义,则把A附加在结点n上并令Node(A)= n;
否则,先从Node(A)的附加标识符集中将A删去(注意,若Node(A)是叶结点,则不能将A删去),
然后再把A附加到新结点n上,并令Node(A)=n。
2.2.3 图示

相关文章: