当前位置:文档之家› 第10章 优化

第10章 优化

第十章优化知识结构:概述基本块的划分局部优化基本块的DAG表示DAG的应用优化程序流图循环优化循环优化数据流分析第一节概述一、优化的原则1、等价原则经过优化后不应改变程序运行的结果。

2、有效原则使优化后生成的目标代码运行的时间较短,占用的存储空间较小。

3、合算原则应尽可能以较低的代价取得较好的优化效果。

二、优化的分类1、与计算机无关的优化是在中间代码级上不依赖具体计算机的优化。

只注重于程序的结构,对程序流程进行有效性、等价性的处理。

⑴局部优化对只有一个入口和一个出口,并且程序结构是顺序结构的程序段进行优化(基本块内的优化)。

采用的技术:①合并已知量(编译时对常数直接进行运算);②消除多余运算(公共子表达式);③消除无用赋值(无用代码)。

⑵循环优化对循环语句产生的中间代码进行优化。

采用的技术:①代码外提(循环不变运算的外提);②强度消弱;③删除归纳变量(循环控制条件的改变)。

⑶全局优化非线性程序段上(包含多个基本块)的优化,需要分析程序控制流、数据流。

2、依赖计算机的优化依赖具体计算机的硬件环境,在生成目标代码时进行优化。

三、中间代码优化技术的概述例:求两个数组积的Pascal程序段PROD := 0;For I:=1 to 20 doPROD := 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*bT2:=a*bT3:=2*T2T4:=T1+T2T5:=b*bT6:=T4+T52、划分基本块的算法⑴求出四元式程序中各个基本块的入口语句。

①程序的第一个语句;②能由条件转移语句或无条件转移语句转移到的语句;③紧跟在条件转移语句后面的语句。

⑵对每一入口语句,构造其所属的基本块。

它是由该入口语句到另一入口语句(不包括该入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的语句序列组成的。

⑶凡未被纳入某一基本块中的语句,都是程序中控制流程无法到达的语句,从而也是不会被执行到的语句,把它们从程序中删除。

例考察下列三地址代码程序求最大公因子程序:(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的第一条语句。

注意: 程序流图与程序流程图不同,上例程序流程图如下:二、基本块内的优化(利用DAG图优化)1、删除公共子表达式T1:=4*IT4:=4*I优化后为 T4:= T12、删除无用赋值R := X (无用赋值,优化后删除)A :=B+CR := YR:=R (无用赋值,优化后删除)无用赋值的规定:①对变量R赋值后,R的值不在被引用;②对变量R赋值后,R的值在被引用前又被重新赋值;③对变量R进行递归赋值,R的值仅在递归赋值时被引用。

3、变换技术(P280)⑴合并已知量运算对象是已知量的,可以在编译时计算出它的值,而不必等到程序运行时再计算。

如T1:=2和T2:=4*T1,优化后为 T2:=8。

⑵临时变量改名通过改变临时变量名,可以把一个基本块变换成等价的另一个基本块。

⑶交换语句的位置再不影响基本块的值的条件下,有时交换语句的次序,可产生更高效的代码。

⑷代数变换对于表达式求值,用代数上的等价的形式替换,以其使复杂运算变成简单运算。

三、基本块的DAG的应用1、确定基本块内的公共子表达式;2、确定哪些名字在基本块内使用,而在基本块外定值;3、确定在基本块内,哪些运算的值,在基本块外被引用。

四、DAG(有向图)的表示形式1、任一有向边n i n j,有序对(n i,n j)中的n i为n j的前驱结点,n j为n i的后继结点。

2、任一有向边n1 n2,n2 n3,⋯,n k-1 n k对应结点序对(n1,n2,⋯,n k)为从n1到达结点n k的一条通路。

3、如果n1=n k则称该通路为环路,如(n2,n2),(n1,n2,n1)。

4、如果有向图中任一通路都不是环路,则称该有向图为无回路有向图(DAG )。

五、DAG 的标识方法各结点中的n i 是构成有向图(DAG )各结点的编号。

1、叶结点(无后继结点)的标识方法⑴ 访问变量或常数标识为A 3.0⑵ 访问变量地址标识为addr(B)2、内部结点用运算符做标识T 1 :=A+B 1A B内部结点n 3 以“+”作为标记,表示该结点代表其后继结点n 1,n 2所代表的值进行“+”运算的结果。

3、各结点附加符号的标识方法⑴ 表示结果值所引用的变量。

如上例 T 1, T 5具有结点n 3所代表求和的值⑵ 表示该结点为转移语句结点,指示转移目标地址。

(s )4、数组元素的赋值结点的标识B C B C A五、中间代码的DAG 结点表示类型中间语言 DAG 结点0型 A:=B (:=,B,-,A )1型 A:=op B(op,B,-,A)A2型3型 D[C]:=B ([]=,B,-,D[C]) 如上图所示goto (s) 如上图所示 六、构造基本块DAG 算法函数NODE(A)用于查表,如果查到, 函数值为代表A 的最新的结点号。

对A := B ,A := op B ,A := B op C 三种中间代码构造DAG 图。

操作步骤:⑴若NODE(B)=null(无定义),则构造一个标记为B 的叶结点并定义NODE(B)为这个结点。

若当前四元式是0型,则记NODE(B)=n ,转⑷;若当前四元式是1型,则转⑵①;若当前四元式是2型, 则当NODE(C)=null(无定义),则构造标记为C的叶结点并定义NOD(C)为这个结点,转⑵②;⑵①若NODE(B)是标记为常数的叶结点,则转⑵③,否则转⑶①。

②如果NODE(B)和NODE(C)都是标记为常数的叶结点,则转⑵④,否则转⑶②。

③执行OP B(即合并已知量),操作得到新的常数P。

若NODE(B)是处理当前四元式新构造出来的结点,则删除它。

如果NODE(P)无定义,则构造一用P做标记的叶结点n,置NODE(P)=n,转⑷。

④执行B OP C(即合并已知量),令得到的新常数为P。

如果NODE(B)或NODE(C)是处理当前四元式时新构造出来的结点,则删除它。

若NODE(P)无定义,则构造一个用P做标记的叶结点n,置NODE(P)=n,转⑷。

⑶①检查DAG中是否已有一结点,其唯一后继为NODE(B)且标记为OP(即找公共子表达式)。

如没有,就构造该结点为n,否则就把已有的结点就作为它的结点并设该结点为n,转⑷。

②检查DAG图中是否已有结点,其左后继为NODE(B),右后继为NODE(C),且标记为OP(即找公共子表达式)。

如果没有,则构造该结点n,否则就把已有的结点作为它的结点并设该结点为n,转⑷。

⑷如果NODE(A)无定义,则把符号A附加在结点n上,并令NODE(A)=n;若NODE(A)已有定义,则应按下列几种情况,决定是否将A从原来NODE(A)结点上的附加标识符中删除。

①若NODE(A)结点有前驱,分下列情况处理:a、若NODE(A)结点上有其它附加标识符,则把A删除。

b、若NODE(A)结点上无其它附加标识符,则不能删除A。

T := B OP K T := A OP K可删除A 不能删除A②若NODE(A)结点无前驱,分下列情况处理a、若NODE(A)结点是叶结点,且有其它附加标识符,则不能删除A。

b、若NODE(A)结点是叶结点,若无其它附加标识符,则删除A。

c、若NODE(A)结点不是叶结点,则删除AB := A A := 3C D不能删除A 删除A删除A例:试构造以下基本块G的DAG(1)T:=3.14(2)T1:=2*T(3)T2:=R+r(4)A:=T1*T2(5)B:=A(6)T3:=2*T(7)T4:=R+r(8)T5:=T3*T4(9)T6:=R-r(10)B:=T5*T600T T13.14 3.14 6.28 3.14 6.28 R r(a) (b) (c)T03.14 6.28 R r 3.14 6.28 R r(d) (e)T4 0T03.14 6.28 R r 3.14 6.28 R r(f) (g)2T7 0T03.14 6.28 R r 3.14 6.28 R r(h) (i)T63.14 6.28 R r(j)六、由DAG图生成优化的中间代码按原来构造结点的顺序,生成优化后的代码,上例生成的优化后代码序列为:优化前的代码优化后的代码(1)T0:3.14 (1)T:=3.14(2)T1:=2*T(2)T1:=6.28 合并已知量(3)T2:=R+r (3)T3:=6.28(4)A:=T1*T2(4)T2:=R+r(5)B:=A (5)T4:=T2删除公共子表达式(6)T3:=2*T(6)A:=6.28*T2(7)T4:=R+r (7)T5:=A(8)T5:=T3*T4(8)T6:=R-r(9)T6:=R-r (9)B:=A*T6(10)B:=T5*T(11)T6:=R*r假设T0 T1 T2 T3 T4 T5在基本块后都不会被引用,优化后的代码:(4)S1:=R+r(6)A:=6.28*S1(8)S2:=R-r(9)B:=A*S2第三节循环优化编译程序首先需要判断程序中哪些部分构成循环,再进行循环优化。

相关主题