1 划分四元式程序为基本块的算法

  1. 从四元式序列确定满足以下条件的入口语句:
    (1)四元式序列的第一个语句
    (2)能由条件转移语句或无条件转移语句转移到的语句
    (3)紧跟在条件转移语句后面的语句
  2. 确定满足以下条件的出口语句
    (1)下一个入口语句的前导语句
    (2)转移语句(包括转移语句自身)
    (3)停语句(包括停语句自身)
  3. 凡未被纳入某一基本块中的语句,可以从程序中删除
    【编译原理】5 代码优化

2 DAG

2.1 四元式的DAG表示

【编译原理】5 代码优化

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 图示

【编译原理】5 代码优化

相关文章: