第十章优化教程文件

  • 格式:doc
  • 大小:213.50 KB
  • 文档页数:36

下载文档原格式

  / 36
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

程序流图:

B4

程序流图是以每个基本块为一个结点,B1到B2构造有向边:

①B2紧跟在B1之后,并且B1的最后一条语句不是一条无条件转移语句;

②有一个条件转移语句或无条件转移语句从B1的最后一条