第10章 优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十章优化
知识结构:
概述
基本块的划分
局部优化基本块的DAG表示
DAG的应用
优化程序流图
循环优化
循环优化
数据流分析
第一节概述
一、优化的原则
1、等价原则
经过优化后不应改变程序运行的结果。
2、有效原则
使优化后生成的目标代码运行的时间较短,占用的存储空间较小。
3、合算原则
应尽可能以较低的代价取得较好的优化效果。
二、优化的分类
1、与计算机无关的优化
是在中间代码级上不依赖具体计算机的优化。只注重于程序
的结构,对程序流程进行有效性、等价性的处理。
⑴局部优化
对只有一个入口和一个出口,并且程序结构是顺序结构的程序段进行优化(基本块内的优化)。采用的技术:
①合并已知量(编译时对常数直接进行运算);
②消除多余运算(公共子表达式);
③消除无用赋值(无用代码)。
⑵循环优化
对循环语句产生的中间代码进行优化。采用的技术:
①代码外提(循环不变运算的外提);
②强度消弱;
③删除归纳变量(循环控制条件的改变)。
⑶全局优化
非线性程序段上(包含多个基本块)的优化,需要分析程序控制流、数据流。
2、依赖计算机的优化
依赖具体计算机的硬件环境,在生成目标代码时进行优化。
三、中间代码优化技术的概述
例:求两个数组积的Pascal程序段
PROD := 0;
For I:=1 to 20 do
PROD := PROD+ A[I]*B[I]
其中:数组元素按字节编写地址;每个元素占4个字节。
⑴数组元素地址为
addr(A)+(I-1)*4=addr(A)-4+4*I
四元式中间代码为:
⑵删除公共子表达式
某些运算在程序段中多次出现,而在相继两次出现之间又没有改变其运算的结果,优化时只是引用结果。
如:⑶ T1:=4*I
┆…无对I重新赋值
⑹ T4:=4*I
优化后为T4=T1。
⑶代码外提
对于运算结果在循环重复执行的过程中是不变的,将其运行代码提到循环体外执行一次。
如:⑷ T2:=addr(A)-4
⑺ T5:=addr(B)-4
把⑷⑺从循环内
中。
⑷ 削弱强度
把乘法运算用加法运算(加减法运算速度快)。
如:I:=1,T 1:=4*I (初值),⑶T 1:=4*I 改为 T 1:=T 1+4
⑸ 删除归纳变量(变换控制条件)
控制变量和某些计算随着循环的重复执行保持同步变化,利用计值结果作为控制变量。
如:T1:=4*I(T1与I存在线性关系),用T1作为控制条件。
⑿ if I≤20 goto (5)优化后if T1≤80 goto(5)。
⑹合并已知量
编译时已知的运算量在编译时计算出来。
如:⑵I:=1,⑶T1:=4*I(已知量)优化后为T1:=4。
⑺复写传播
两个不同的运算对象,在相继出现之间结果相同,采用替换方式,如:⑹T4:=T1,⑻T6:=T5[T4]优化后为⑻T6:=T5[T1]。
⑻删除无用赋值
删除在程序运行中没有任何作用的代码。
如:⑵、⑹、⑾均为无用赋值(删除)。
四、诊断编译程序和优化编译程序
优化编译程序:
着重于提高目标代码效率的编译程序称优化编译程序。优化需要花费大量编译时间,若一个简单编译程序只需实现基本翻译功能,那么该编译程序可以不需要优化部分。
诊断编译程序:
专门用于帮助程序开发和调试的编译程序称诊断编译程序, 该编译程序一般不包含优化部分。
第二节局部优化
对一个给定的程序,把它划分为一系列的基本块。在各个基本块范围内,分别进行优化。局限于基本块范围内的优化称为基本块内的优化(或称为局部优化)。
一、基本块及其流图
1、基本块
⑴是指程序中一个顺序执行的语句序列。
⑵其中只有一个入口和一个出口,入口就是其中的第一个语句,出口就是其中的最后一个语句。
⑶对一个基本块来说,执行时只能从其入口进入,从其出口退出。
例一个基本块的三地址语句序列:
T1:=a*b
T2:=a*b
T3:=2*T2
T4:=T1+T2
T5:=b*b
T6:=T4+T5
2、划分基本块的算法
⑴求出四元式程序中各个基本块的入口语句。
①程序的第一个语句;
②能由条件转移语句或无条件转移语句转移到的语句;
③紧跟在条件转移语句后面的语句。
⑵对每一入口语句,构造其所属的基本块。它是由该入口语句到另一入口语句(不包括该入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的语句序列组成的。
⑶凡未被纳入某一基本块中的语句,都是程序中控制流程无法到达的语句,从而也是不会被执行到的语句,把它们从程序中删除。
例考察下列三地址代码程序
求最大公因子程序:
(1)•read X
(2) read Y
(3)•R:=X mod Y
(4) if R=0 goto(8)
(5)•X:=Y
(6) Y:=R
(7) goto (3)
(8)•write Y
(9)halt
程序流图:
程序流图是以每个基本块为一个结点,B1到B2构造有向边:
①B2紧跟在B1之后,并且B1的最后一条语句不是一条无条件转移语句;
②有一个条件转移语句或无条件转移语句从B1的最后一条语句转移到B2的第一条语句。
注意: 程序流图与程序流程图不同,上例程序流程图如下: