编译原理第六章 代码优化ok.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理第六章 代码优化ok

四元式的类型与DAG结点 3.若DAG中原来已有代表B op C的结点,则不必建立新的结点,只须把变量A附加到表示B op C之值的结点上去即可。 例6.2 对如下的基本块构造基本块DAG : (1) T1 := A*B (2) T2 := 3/2 (3) T3 := T1-T2 (4) X := T3 (5) C := 5 (6) T4 := A*B (7) C := 2 (8) T5 := 18+C (9) T6 := T4*T5 (10)Y := T 基本块的优化处理 第一,合并常数和已知量的运算,并将产生的运算结果标记为叶结点,不再产生运算的内部结点(见图6-2(b), (g)) 第二,合并公共子表达式 基本块内多次出现同一运算的四元式,仅构造第一个四元式运算的内部结点;以后的各次出现,只把要赋予结果的各变量标识符附加到相应内部结点(见图6-2(e)) 第三,消除基本块内无用赋值。 在基本块内被多次赋值的变量,若在被引用之前被再次赋值,算法6.2的第(4)步,除了把此变量名附加到新产生的结点之外,还把它从老结点的附加标识符集中逐出(见图6-2(f)),使对该变量的前一次赋值无效 C=5 c=2 基本块的DAG,算法6.2 所构造的DAG 优化后的四元式序列 6.3 全局优化 构造 程序流图的方法是: 对于程序中的两个基本块Bi和Bj,如果Bj紧接着Bi被执行,则从Bi引一条有向边到结点Bj,称Bi为Bj的直接前驱,Bj为Bi的直接后继。 规则1:按基本块在程序中排列的自然次序,Bj紧跟在Bi之后,且Bi的出口语句不是无条件转移或停语句; 规则2:Bi的出口语句是一个无条件转移或条件转移语句,且其目标是Bj的入口语句。 程序流图示例 二、方法 1、使用变量到达-定值数据流方程和变量引用-定值链 2、使用活跃变量数据流方程 d)变量A的到达与定值 若d点是变量A的一个定值点,u点是A的一个引用点,存在一条从d到u的通路,并在此通路上没有对A的其他定值点,则称d点对A的定值能达到u点。 e)引用-定值链 假定在程序中某点u引用了变量A,则把能到达u的A的所有定值点的全体,称为A在引用点u的引用-定值链(ud链) 集合GEN[B]及KILL[B]可以根据程序流图,对基本块B的DAG叶结点所标记的标识符及内部结点的附加标识符进行考察,确定各个定值点。 对程序流图中的所有基本块B求出相应IN[B]之后,按如下规则确定到达B中点P的任一变量A的全部定值点。 规则1:如果B中P点之前有A的定值(可能为多个),则这些定值点中,离P最近的那个点就是能到达P的唯一定值点; 规则2:如果B中P点之前无A的定值,则能到达P的A的定值点是包含在集合IN[B]中的那些A的定值点。 四个集合之间内在的关系 首先,程序中某一点d对变量A的定值可到达基本块B的出口之后,当且仅当 (1)此定值能到达基本块B的入口之前,且B中不再对A重新定值 (即d∈IN[B]-KILL[B] ) ; (2)或者点d在B中,且对A的定值能到达B的出口之后(即d∈GEN[B]) OUT[B]=IN[B]–KILL[B]?GEN[B] (6.1) 例6.4 图6-6 例6.5 变量I的引用点为d2和d6,J的引用为d4,d5和d7。求出它们的ud链。 对于基本块B1,由于I的引用点d2之前有唯一的定值点d1,因此, I在d2的ud链为{d1}。 对基本块B3,由于J的引用点d4之前无J的块内定值点,故J在d4的ud链为IN[B3]中所包含的J点的定值点,即 {d2,d4,d5}。 常数传播及相应地合并已知量 如果能到达某一点P有变量A的唯一定值点 d:A := c (c为常数) P是A的一个引用点,那么,在P点A的值也必然为c,故可将P点对A的引用代之以常数c,这种操作称为常数传播。 在图6-6中,由于IN[B5]={d3,d4,d5},故能到达d6的I 的定值点是唯一的,即 d3:I := 1 从而可知在d6对I的引用可替之以常数1,也就是可将d6改写为 d6:I := 6 算法6.4 常数传播和合并已知量的处理 CHANGE=1; while(CHANGE) { CHANGE=0; for (程序中的每个语句s) { for(s的每个运算量v) if(v在引用点s的ud链仅含一个d且语句d为v=C(C为常数) ) { 把s中所有对v的引用均替换为C; CHANGE=1;

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档