网站大量收购独家精品文档,联系QQ:2885784924

编译原理(第5版)-课件(更新)2025第7章代码优化 .pptx

编译原理(第5版)-课件(更新)2025第7章代码优化 .pptx

  1. 1、本文档共59页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

本章主要介绍:

优化基本概念

基本块内的局部优化

;什么是代码优化?

对程序实施各种等价变换,使得变换后程序能生成高效率的目标代码。

高效率的目标代码是指:

目标代码占用的存储空间少

目标代码运行时间短

代码优化的原则

1.等价原则:保证等价性。

2.有效原则:有明显的效果。

3.合算原则:较低的代价取得较好的优化效果。

;代码优化的种类:;;S=0;

for(i=1;i=20;i++)

S=S+A[i]*B[i];;;删除公共子表达式

(删除多余运算);;2.代码外提;;;;4.变换循环控制条件

(删除归纳变量);;5.合并已知量

已知量是指,常数或在编译时就能确定其值的变量。

合并已知量是指,若参加运算的两个对象在编译时都是已知量,则可以在编译时直接计算出它们的运算结果,不必生成目标。;;6.复写传播

是指尽量不引用那些在程序中仅仅只传递信息而不改变其值,也不影响其运行结果的变量。;;7.删除无用赋值

对赋值语句X=Y,若在程序的任何地方都不引用X,这时该语句执行与否对程序运行结果没有任何作用,这种语句称为无用赋值语句,可以删除。;7.1优化概述;(5)T3=T2[T1]

(8)T6=T5[T1]

(9)T7=T3*T6

(10)S=S+T7

(3)T1=T1+4

(12)ifT1≤80goto(5);局部优化是指局限于程序基本块范围内的一种优化。

入口语句

四元式序列的第一个语句

由条件转移语句或无条件转移语句转移到的语句

紧跟在条件语句之后的语句

出口语句

下一个入口的前导语句

转移语句

停语句

;例划分基本块,构造程序流图。

;利用DAG实现局部优化的思想:

首先对一个基本块构造一个DAG,然后按构造结点的次序将DAG还原成四元式序列。;结点带有标记的DAG:

;基本块的DAG表示:

;(5)ifBropCgoto(S);例构造以下基本块的DAG:

(1)T0=3.14

(2)T1=2*T0

(3)T2=R+r

(4)A=T1*T2

(5)B=A

(6)T3=2*T0

(7)T4=R+r

(8)T5=T3*T4

(9)T6=R-r

(10)B=T5*T6

;;;;(1)T0=3.14

(2)T1=6.28

(3)T3=6.28

(4)T2=R+r

(5)T4=T2

(6)A=6.28*T2

(7)T5=A

(8)T6=R-r

(9)B=A*T6;(1)T0=3.14

(2)T1=6.28

(3)T3=6.28

(4)T2=R+r

(5)T4=T2

(6)A=6.28*T2

(7)T5=A

(8)T6=R-r

(9)B=A*T6;设优化后的上述一组四元式序列为G,G较之优化前的一组四元式G,不但代码总数减少,而且??G中四元式(2)T1=2*T0和(6)T3=2*T0,在G中已被优化为T1=6.28,T3=6.28,这是合并已知量的结果;对G中四元式(5)B=A,直至在下一个B被赋值时都没有被引用,;显然是无用赋值,G中已被删除;对G中具有公共子表达式的四元式(3)T2=R+r,(7)T4=R+r,G中被优化为直接赋值T4=T2,避免了对公共子表达式R+r的重复计算。综上所述,利用DAG可以很方便地进行基本块内的优化处理。

;7.3循环优化;控制流程图

一个程序的控制流程图(简称为程序流图或流图)G是一个三元组

G=(N,n0,E)。其中:;N表示流图的有限结点集,流图中每一个结点对应程序中的一个基本块,因此,N实质上就是一个程序的基本块集。

n0表示唯一的首结点,流图的首结点是包含程序第一个语句的基本块。

E表示流图的有向边集。

;为了找出流图中的循环,需分析流图中结点间的控制关系。因此引入必经结点和必经结点集的概念。;必经结点

在程序流图中,对任意两个结点a和b,若从流图的首结点出发,到达a的任一通路都要经过b,则称b是a的必经结点,记为bDOMa。

;必经结点集

流图中结点a的所有必经结点的集合称为结点a的必经结点集,记为D(a);求流图中所有结点n的必经结点集D(n)的算法思想:

结点n∪n的所有前驱结点的必经结点的交,即如果某结点d是结点n的所有前驱结点的必经结点,则d为n的必经结点。;流图中各结点的必经结点集:

D(B1)={B1}

D(B2)={B1,B2}

D(B3)={B1,B2,B3}

D(B4)={B1,B2,B3,B4}

D(B5)={B1,B2,B3,B5}

D(B6)={B1,B2,B3

文档评论(0)

balala11 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档