




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第1111章章 代码优化代码优化11111 1 什么是代码优化什么是代码优化11112 2 局部优化局部优化11113 3 控制流程分析和循环控制流程分析和循环 何谓代码优化:何谓代码优化: 所谓优化,实质上是对代码进行等价变换,使得变所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。而运行速度加大或占用存储空间少,或两者都有。一般,优化工作阶段可在中间代码生成之后和一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行,如图所示:(或)目标代码生成之后进
2、行,如图所示: 编译程序的优化工作的宗旨:生成较好性能的目编译程序的优化工作的宗旨:生成较好性能的目标代码。标代码。为此,编译程序需要对代码(中间代码或目标代为此,编译程序需要对代码(中间代码或目标代码)进行各种方式的变换,变换必须保证:码)进行各种方式的变换,变换必须保证:等价等价-经优化工作变换后的代码运行结果应与经优化工作变换后的代码运行结果应与原来程序运行结果一样。原来程序运行结果一样。优化分类优化分类根据优化所涉及的程序范围分成根据优化所涉及的程序范围分成: :(1)(1)局部优化局部优化:(:(基本块基本块) )(2)(2)循环优化循环优化: :对循环中的代码进行优化对循环中的代码
3、进行优化(3)(3)全局优化全局优化: :大范围的优化大范围的优化按阶段分按阶段分: :与机器无关的优化与机器无关的优化-对中间代码进行对中间代码进行依赖于机器的优化依赖于机器的优化-对目标代码进行对目标代码进行常用的优化技术有:常用的优化技术有:删除多余运算,循环不变代码外提,强度删除多余运算,循环不变代码外提,强度削弱,变换循环控制条件,合并已知量,削弱,变换循环控制条件,合并已知量,复写传播与删除无用赋值。复写传播与删除无用赋值。1 1、删除多余运算、删除多余运算如果有表达式如果有表达式e1e1和和e2e2,且它们的值始终相同,则,且它们的值始终相同,则e2e2的计算部的计算部分可以省略
4、,只要用分可以省略,只要用e1e1的值即可。的值即可。例:例:A:=BA:=B* *D+1;D+1; E:=B E:=B* *D-1;D-1; G:=B G:=B* *D+2;D+2; 其中三个其中三个B B* *D D的子表达式始终一致,因此,可以优化为:的子表达式始终一致,因此,可以优化为: T1:=BT1:=B* *D;D; A:=T1+1; A:=T1+1; E:=T1-1; E:=T1-1; G:=T1+2; G:=T1+2;例:例: A:=B*D; B:=B*D; C:=B*D; 三个式子中的三个式子中的B B* *D D形式相同,但第三个式子中的形式相同,但第三个式子中的B B*
5、 *D D与前两个式中的与前两个式中的B B* *D D的值不同,因此,第三个的值不同,因此,第三个 B B* *D D不能省不能省。 可优化:可优化:T1:=B*D; A:=T1; B:=T1; C:=B*D;注意:只有形式相同还不行,必须值也要相同,即形式相同并注意:只有形式相同还不行,必须值也要相同,即形式相同并不能保证值相同。不能保证值相同。例例: P:=0; for I:=1 to 20 do P:=P+AI*BI;将它翻译为四元式的形式将它翻译为四元式的形式假定数组的每个元素占假定数组的每个元素占4 4个字节,个字节,add(A)add(A)是是A A数组的数组的基址,基址,W W
6、是元素的字节宽度,是元素的字节宽度,lowlow为数组的下界,一为数组的下界,一维数组维数组AiAi的地址:的地址:add(A)+(i-low)add(A)+(i-low)* *W W=add(A)+(i-1)=add(A)+(i-1)* *4 4=add(A)-4+4=add(A)-4+4* *i i(1)P:=0(2)I:=1(3)T1:=4*I(4)T2:=addr(A)-4(5)T3:=T2T1(6)T4:=4*I(7)T5:=addr(B)-4(8)T6:=T5T4(9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)if I=20 goto(3)P:=0; fo
7、r I:=1 to 20 do P:=P+AI*BI;代码外提代码外提(4),(7)提到循环外面。删除公共子表达式删除公共子表达式见两见两图中的(图中的(3)()(6)变化。)变化。2、代码外提(循环外提)、代码外提(循环外提)例:A:=B*C1000次并且B与C是不变量则可以把B*C提到循环的外面,这就减少了999次运算。再见上页图T1:=B*CA:=T11000次3、强度削弱、强度削弱把高强度的运算改为低强度的运算。把高强度的运算改为低强度的运算。如把乘法改为加法:如把乘法改为加法:a*2=2*a=a+a例例 for i:=1 Step 2 until n do Begin B:=i*k;
8、 End 其中其中K是不变量是不变量因此可以优化为:因此可以优化为: T1:=1*k; T2:=2*k;for i:=1 Step 2 until n do begin B:=T1;T1:=T1+T2; Endi=1时,B1*ki=3时,B3*ki=5时,B5*k即每次增加2*k(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2T1(6)T4:=T1(8)T6:=T5T4(9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)if I=20 goto(3)(1)P:=0(2)I:=1(4)T2:=
9、addr(A)-4(7)T5:=addr(B)-4(5)T3:=T2T1(6)T4:=T1(8)T6:=T5T4(9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)if I=20 goto(5)(3)T1:=4*I(3)T1:=T1+4强度削弱强度削弱4、变换循环条件、变换循环条件如上例中,因为I与T1始终保持T1:=4*I的关系,将循环条件I20变成T1 80,整个程序运行结果不变,这样变化的好处是(11)号四元式便可以删除。(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2T1(6)T4:
10、=T1(8)T6:=T5T4(9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3)T1:=T1+4(12)if I=20 goto(5)(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(5)T3:=T2T1(6)T4:=T1(8)T6:=T5 (9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3)T1:=T1+4(12)if =80 goto(5)(3)T1:=4T1T1变换循环控制条件,合并已知量,复写传播变换循环控制条件,合并已知量,复写传播5、合并已知量:、合并已知量:例例:a = 10 * 5 + 6 -
11、b; tmp0 = 10 ; tmp1 = 5 ; tmp2 = tmp0 * tmp1 ; tmp3 = 6 ; tmp4 = tmp2 + tmp3 ; tmp5 = tmp4 - b a = tmp5 ;合并已知量后:合并已知量后:tmp0 = 56 ;tmp1 = tmp0 - b ;a = tmp1 ;(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2T1(6)T4:=T1(8)T6:=T5T4(9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3)T1:=T1+4(12)if I=20
12、goto(5)(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(5)T3:=T2T1(6)T4:=T1(8)T6:=T5 (9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3)T1:=T1+4(12)if =80 goto(5)(3)T1:=4T1T1合并已知量合并已知量6、复写传播、复写传播例1:tmp2 = tmp1 ;tmp2 = tmp1 ;tmp3 = tmp2 tmp3 = tmp2 * *tmp1;tmp1;tmp4 = tmp3 ;tmp4 = tmp3 ;tmp5 = tmp3 tmp5 = tmp3 * *tmp
13、2 ;tmp2 ;c = tmp5 + tmp4 ;c = tmp5 + tmp4 ;优优化后化后变为变为: :tmp3 = tmp1 tmp3 = tmp1 * * tmp1 ; tmp1 ;tmp5 = tmp3 tmp5 = tmp3 * * tmp1 ; tmp1 ;c = tmp5 + tmp3 ;c = tmp5 + tmp3 ;(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2T1(6)T4:=T1(8)T6:=T5T4(9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3)T1:=T
14、1+4(12)if I=20 goto(5)(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(5)T3:=T2T1(6)T4:=T1(8)T6:=T5 (9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3)T1:=T1+4(12)if =80 goto(5)(3)T1:=4T1T1复写传播复写传播(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4(5)T3:=T2T1(6)T4:=T1(8)T6:=T5T1(9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3
15、)T1:=T1+4(12)if T1=80 goto(5)(1)P:=0(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4(5)T3:=T2T1(8)T6:=T5T1(9)T7:=T3*T6(10)P:=P+T7(3)T1:=T1+4(12)if T1= C goto L2(6) B:=B+1(7) goto L1(8) L2: write (A)(9) halt划分成四个基本块划分成四个基本块 B1,B2,B3,B4 B1 (1) (2) (3) 基本块内实行的优化基本块内实行的优化:合并已知量合并已知量 删除多余运算删除多余运算 B2 (4) 删除无用赋值删除
16、无用赋值 (5) B3 (6) (7) B4 (8) (9) (1) read (C)(2) A:= 0(3) B:= 1(4) L1: A:=A + B(5) if B= C goto L2(6) B:=B+1(7) goto L1(8) L2: write (A)(9) haltn以基本块为结点,以控制流为有向边以基本块为结点,以控制流为有向边n流图,流图,n n0 0 n:基本块集:基本块集nn n0 0 :含首语句的基本块:含首语句的基本块n:有向边集合:有向边集合 A A B BA A 的出口为转移语句,转向的出口为转移语句,转向 B B 的入口的入口B B 紧跟紧跟 A A 之后,
17、且之后,且 A A 的出口不是无条件的出口不是无条件转移语句转移语句 goto(s) goto(s) 或或 returnreturn划分成四个基本块划分成四个基本块 B1,B2,B3,B4 B1 (1) (2) (3) 基本块内实行的优化基本块内实行的优化:合并已知量合并已知量 删除多余运算删除多余运算 B2 (4) 删除无用赋值删除无用赋值 (5) B3 (6) (7) B4 (8) (9) (1) read (C)(2) A:= 0(3) B:= 1(4) L1: A:=A + B(5) if B= C goto L2(6) B:=B+1(7) goto L1(8) L2: write (
18、A)(9) halti = m - 1;j = n;v = a n ;while( 1 ) do i=i+1;while( ai v );if( i = j ) break;x = a i ; a i = a j ;a j = x;x = a i ;a i = a n ; a n = x;C语言数组语言数组ai的地址的地址a+(i-low)*W(1) i := m - 1(2) j := n(3) t1 := 4 * n;(4) v := a t1 (5) i := i + 1(6) t2 := 4 * i;(7) t3 := a t2 ;(8) if t3 v goto (9)(13) if
19、 i = j goto (23)(14) t6 := 4 * i(15) x := at6(16) t7 := 4 * i(17) t8 := 4 * j(18) t9 := a t8 (19) a t7 := t9(20) t10 := 4 * j(21) a t10 := x(22) goto (5)(23) t11 := 4 * i(24) x := at11(25) t12 := 4 * i(26) t13 := 4 * n(27) t14 := a t13 (28) a t12 := t14(29) t15 := 4 *n(30) a t15 := x基本块的基本块的DAG表示及其应
20、用表示及其应用DAG Directed Acyclic GraphDAG Directed Acyclic Graph 无环路有向图无环路有向图(P253)(P253)基本块的基本块的DAGDAG是在结点上带有标记的是在结点上带有标记的DAGDAG叶结点:叶结点:无后继的结点无后继的结点, ,以一标识符以一标识符( (名字名字, ,常数常数) )标记标记, ,表示该结点代表该变量或常数的值。表示该结点代表该变量或常数的值。如如果叶子结点代表该变量果叶子结点代表该变量A A的地址,则的地址,则addr(A)addr(A)作作为该结点的信息。为该结点的信息。内部结点:内部结点:即有后继的结点,即有
21、后继的结点,以运算符号标记表以运算符号标记表示该结点代表应用该运算符对其后继结点所表示该结点代表应用该运算符对其后继结点所表示的值进行运算的结果。示的值进行运算的结果。各个结点:各个结点:图中各结点可能附加一个或多个标识图中各结点可能附加一个或多个标识符标记表示这些变量具有该结点表示的值符标记表示这些变量具有该结点表示的值四元式四元式DAG结点结点(0)A:=B(:=,B,A) n1 A B(1) : A:=op B(op,B, ,A) n2 A op n1 B(2) : A:=B op C(op, B, C,A) n3 Aop n1 n2B Cn1n2n1n3n1n2四元式与DAG结点:(3
22、)A:=BC (=,BC,-,A) (4)if B rop C goto (s) (jrop,B,C,(,(s) (5)DC:=B (=,B,-,DC) (6)goto (s) (j,-,-,(,(s) (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 四元式序列G: To 3.14 (a)n1T0:=3.14 T0 T1 3.14 6.28 (b)n2n1T0:=3.14T1:=2*T0T0:=
23、3.14 T2 + T0 T1 3.14 6.28 R r (c)n2n5n3n1n4T0:=3.14T1:=2*T0T2:=R+r A * T2 + T0 T1 3.14 6.28 R r (d)n2n5n3n1n4n6T0:=3.14T1:=2*T0T2:=R+rA:=T1*T2 A,B * T2 + T0 T1 3.14 6.28 R r (e)n2n5n3n1n4n6T0:=3.14T1:=2*T0T2:=R+rA:=T1*T2B:=A A,B * T2 + T0 T1,T3 3.14 6.28 R r (f)n2n5n3n1n4n6T0:=3.14T1:=2*T0T2:=R+rA:=
24、T1*T2B:=AT3:=2*T0 A,B * T2,T4 + T0 T1,T3 3.14 6.28 R r (g)n2n5n3n1n4n6T0:=3.14T1:=2*T0T2:=R+rA:=T1*T2B:=AT3:=2*T0T4:=R+r A,B,T5 * T2,T4 + T0 T1,T3 3.14 6.28 R r (h)n2n5n3n1n4n6T0:=3.14T1:=2*T0T2:=R+rA:=T1*T2B:=AT3:=2*T0T4:=R+rT5:=T3*T4 A,B,T5 * T2,T4 T6 + - T0 T1,T3 3.14 6.28 R rn2n5n3n7n1n4n6T0:=3.
25、14T1:=2*T0T2:=R+rA:=T1*T2B:=AT3:=2*T0T4:=R+rT5:=T3*T4T6:=R-r B * A,T5 * T2,T4 T6 + - T0 T1,T3 3.14 6.28 R r (j)n2n5n3n7n1n4n6n8T0:=3.14T1:=2*T0T2:=R+rA:=T1*T2B:=AT3:=2*T0T4:=R+rT5:=T3*T4T6:=R-rB:=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
26、*T6 B * A,T5 * T2,T4 T6 + - T0 T1,T3 3.14 6.28 R r (j)n2n5n3n7n1n4n6n8G:把把GG和原基本块和原基本块G G相比,可以看出:相比,可以看出:1 1 G G中的代码(中的代码(2 2)和()和(6 6)的已知量都已合并。)的已知量都已合并。2 2 G G中(中(5 5)的无用赋值已被删除。)的无用赋值已被删除。3 3 G G中(中(3 3)和()和(7 7)的公共子表达式)的公共子表达式R+rR+r只被计算只被计算 一次,删除了多余运算。一次,删除了多余运算。所以所以GG是是G G的优化结果。的优化结果。G: (1)T0:=3
27、.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*T6G(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因为循环中的代码要反复执行,因而为了提高目标代码的效率必须着重考虑循环的代码优化。要进行循环优化。首先必须找出程序中的循环,为找出程序中的循环,就需要对程序的控制流程进行分析。 它
28、们中间有且只有一个是入口结点它们中间有且只有一个是入口结点。所谓入口结点,是指序列中具有下述性质的结点:所谓入口结点,是指序列中具有下述性质的结点:从序列外某结点,有一有向边引到它,或者它就是从序列外某结点,有一有向边引到它,或者它就是程序流图的首结点程序流图的首结点。在程序流图中,我们称在程序流图中,我们称具有下列性质的结点序列称为具有下列性质的结点序列称为一个循环:一个循环: 它们是强连通的。它们是强连通的。也即,其中任意两个结点之间,也即,其中任意两个结点之间,必有一条通路,如果序列只包含一个结点,则必有必有一条通路,如果序列只包含一个结点,则必有一有向边从该结点引到其自身。一有向边从该
29、结点引到其自身。 例如,图中的程序流图,根据例如,图中的程序流图,根据定义定义: :结点序列结点序列6 6,4 4,5 5,6 6,7 7以及以及2 2,3 3,4 4,5 5,6 6,7 7都是循环;都是循环;而结点序列而结点序列2,4,2,3,4,4,6,7以及以及4,5,7虽然都是强连通的,但因它们虽然都是强连通的,但因它们的入口结点不唯一,所以都不是上的入口结点不唯一,所以都不是上述意义下的循环。述意义下的循环。必经结点和必经结点集的定义。必经结点和必经结点集的定义。在程序流图中,对任意两个结点在程序流图中,对任意两个结点m m和和n n,如果从流图的如果从流图的首结点出发,到达首结点
30、出发,到达n n的任一通路都要经过的任一通路都要经过m m,则称,则称m m是是n n的必经结点,记为的必经结点,记为m DOM nm DOM n。流图中结点流图中结点n n的所有必经的所有必经结点的集合,称为结点结点的集合,称为结点n n的必经结点集,记为的必经结点集,记为D D(n n)。)。直接由定义和直接由定义和DOM的性质,可以求得:的性质,可以求得:D(1)=1D(2)=1,2D(3)=1,2,3D(4)=1,2,4D(5)=1,2,4,5D(6)=1,2,4,6D(7)=1,2,4,7它具有以下性质:1. 自反性:对流图中任意结点a,有a DOM a。2. 传递性:对流图中任意结
31、点a、b和c。若a DOM b, b DOM c,则有a DOM c。3. 反对称性:若a DOM b且b DOM a,则必有ab。 循环的查找循环的查找循环的查找算法循环的查找算法回边:假设回边:假设ab是流图中的一条有向边,如果是流图中的一条有向边,如果b DOM a,则,则称称 a b是流图中的一条回边。是流图中的一条回边。有向边有向边 ndnd是回边,组成的循环是由结点是回边,组成的循环是由结点d ,结点,结点 n以及有以及有通路到达通路到达 n而该通路不经过而该通路不经过 d的所有结点组成,并且的所有结点组成,并且d是该循是该循环的唯一入口结点。环的唯一入口结点。例例: 回边回边 6
32、 6 7 4 (因为因为4是是7的必经结点的必经结点) 4 2 (因为因为2是是4的必经结点的必经结点) 如图所示求回边和循环D(1)=1D(2)=1,2D(3)=1,2,3D(4)=1,2,4D(5)=1,2,4,5D(6)=1,2,4,6D(7)=1,2,4,7假设假设ab是流图中的一条有向边,如果是流图中的一条有向边,如果b DOM a (b是是a 的必经结点的必经结点),则称,则称ab是流图中的一条回边。是流图中的一条回边。已知有向边已知有向边nd是回边,该循环就是由结点是回边,该循环就是由结点d、结点、结点n以及有通路到达以及有通路到达n而该通路而该通路不经过不经过d的所有结点组成,
33、并且的所有结点组成,并且d是该循环的唯一入口结点。是该循环的唯一入口结点。循环循环 64,5,6,72,3,4,5,6,7 对图中的流图:(1) 求出流图中各结点n的必经结点集D(n); (2) 求出流图中的回边;(3) 求出流图中的循环。 解答:(1)D(1)=1D(2)=1,2 D(3)=1,2,3 D(4)=1,2,3,4D(5)=1,2,3,5 D(6)=1,2,3,6 D(7)=1,2,7 D(8)=1,2,7,8 (2)回边 7 2 (3)循环 2,3,4,5,6,7代码外提:代码外提: 减少循环中代码数目的一个重要办法是代码外提。前面已经介绍了一个代码外提的例子.这种变换把循环不
34、变运算,即产生的结果独立于循环执行次数的表达式,放到循环的前面。这里,所讨论的循环只存在一个入口。实行代码外提时,在实行代码外提时,在循环的入口结点前面建立一个新结点(基本块),称之为循循环的入口结点前面建立一个新结点(基本块),称之为循环的前置结点。环的前置结点。循环的前置结点以循环的入口结点为其唯一循环的前置结点以循环的入口结点为其唯一后继,后继,原来流图中从循环外引到循环入口结点的有向边,改原来流图中从循环外引到循环入口结点的有向边,改成引到循环前置结点,如图所示:成引到循环前置结点,如图所示: 循环优化的三种重要技术是:循环优化的三种重要技术是:代码外提代码外提;删除归纳变量删除归纳变
35、量和强度削弱强度削弱。n将循环不变运算移到循环外将循环不变运算移到循环外例例 11-2:程序优化:程序优化i = 0;while( i = 20 goto (8)(3) if i = 20 goto (8)是否在任何情况下,都可把循环不变运算外提呢是否在任何情况下,都可把循环不变运算外提呢? ?下面我们看一个下面我们看一个例子。例子。例考察下面的流图。例考察下面的流图。容易看出容易看出B2B2,B3B3,B4B4是循环,其中是循环,其中B2B2是循环的入口结点,是循环的入口结点,B4B4是出口结点。是出口结点。所谓出口结点,是指循环中具有这样性质的结点:所谓出口结点,是指循环中具有这样性质的结
36、点:从该结点有一有向边引到循环外的某结点。从该结点有一有向边引到循环外的某结点。 图1图中的图中的B3B3中中i=2i=2是循环不变运算。如果我们把是循环不变运算。如果我们把i=2i=2提到提到循环循环 的前置结点的前置结点B2B2中,如图所示:中,如图所示: 结果是否相同?结果是否相同?为什么?为什么?如果我们按照图如果我们按照图2 2的程序流图执行,执行到的程序流图执行,执行到B5B5时,时,i i的值的值总为总为2 2,则,则j j的值也为的值也为2 2。事实上,按图。事实上,按图1 1的流图,若的流图,若x x3030,y y2525,则,则B3B3不被执行,执行到不被执行,执行到B5
37、B5时,时,i i和和j j的值都的值都为为1 1,所以图,所以图2 2的流图改变了原来程序的运行结果。的流图改变了原来程序的运行结果。问题的原因在于问题的原因在于B3B3不是循环出口结点不是循环出口结点B4B4的必经结点。的必经结点。所以,当把一个不变运算提到循环的前置结点时,所以,当把一个不变运算提到循环的前置结点时,要求要求该不变运算所在的结点是循环所有出口结点的必经结点。该不变运算所在的结点是循环所有出口结点的必经结点。当把循环中的不变运算当把循环中的不变运算s:s:A:=B op C外提时注意:外提时注意:(2)(2)要求循环中其它地方不再有要求循环中其它地方不再有A A的定值点。的
38、定值点。 (3)(3)要求循环中要求循环中A A的所有引用点都是而且仅仅是的所有引用点都是而且仅仅是 这个定值所能达到的这个定值所能达到的(1 1)要求)要求s s所在结点是循环的所有出口结点的必经结点所在结点是循环的所有出口结点的必经结点基本归纳变量:基本归纳变量:如果在循环中,对变量如果在循环中,对变量I I只有唯一的只有唯一的形如:形如: I:=II:=IC C 的赋值,且的赋值,且C C为循环不变量,则称为循环不变量,则称I I为循环中的基本归纳变量。为循环中的基本归纳变量。归纳变量的删除:归纳变量的删除:归纳变量:归纳变量:如果如果I I为循环中的一个基本归纳变量,为循环中的一个基本
39、归纳变量,J J在在循环中的定值总是可以化为循环中的定值总是可以化为I I的同一线性函数也即的同一线性函数也即J JC1C1* *I IC2,C2,其中其中C1C1、C2C2都是循环不变量,则称都是循环不变量,则称J J为的归为的归纳变量,并称它与纳变量,并称它与I I同族。一个基本归纳变量也是归同族。一个基本归纳变量也是归纳变量。纳变量。例:例:P250 P250 图图11.311.3到到P251 P251 图图11.6 I11.6 I为基本归纳为基本归纳变量,变量,T1T1为归纳变量,开始有两个归纳变量为归纳变量,开始有两个归纳变量I I与与T1T1,最后减为最后减为1 1个。个。归纳变量
40、的删除,一方面可以删除归纳变量,同时归纳变量的删除,一方面可以删除归纳变量,同时也可以削弱计算强度。也可以削弱计算强度。如果有一个循环中的多个归纳变量,归纳变量的个如果有一个循环中的多个归纳变量,归纳变量的个数往往可以减少,甚至减到数往往可以减少,甚至减到1 1。减少归纳变量的优减少归纳变量的优化称为归纳变量的删除。化称为归纳变量的删除。i := i + 1t2 := 4 * i;t3 := a t2 ;if t3 v goto B3B3if i = j goto B6t11 := 4 * ix := at11t12 := 4 * it13 := 4 *nt14 := a t13 a t12
41、:= t14t15 := 4 * na t15 := xB6t6 := 4 * ix := at6t7 := 4 * it8 := 4 * jt9 := a t8 a t7 := t9t10 := 4 * jat10:=xgoto B2B5B4对如图所示的代码进行优化:删除公用表达式复写传播删除无用的赋值删除归纳变量强度削弱变换循环条件i := i + 1t2 := 4 * i;t3 := a t2 ;if t3 v goto B3B3if i = j goto B6t11 := 4 * ix := at11t12 := 4 * it13 := 4 *nt14 := a t13 a t12 :
42、= t14t15 := 4 * na t15 := xB6t6 := 4 * ix := at6t7 := 4 * it8 := 4 * jt9 := a t8 a t7 := t9t10 := 4 * jat10:=xgoto B2B5B4删除公用表达式删除公用表达式删除公用表达式后i := i + 1t2 := 4 * i;t3 := a t2 ;if t3 v goto B3B3if i = j goto B6t11 := t2x := at11t12 := t11t13 := t1t14 := a t13 a t12 := t14t15 := t1a t15 := xB6t6 := t
43、2x := at6t7 := t6t8 := t4t9 := a t8 a t7 := t9t10 := t8at10:=xgoto B2B5B4i := i + 1t2 := 4 * i;t3 := a t2 ;if t3 v goto B3B3if i = j goto B6t11 := t2x := at11t12 := t11t13 := t1t14 := a t13 a t12 := t14t15 := t1a t15 := xB6t6 := t2x := at6t7 := t6t8 := t4t9 := a t8 a t7 := t9t10 := t8at10:=xgoto B2B5B4t6 := t2x := at6=at2=t3t7 := t2t8 := t4t9 := a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高压线路安全事故免责协议书
- 制定有效的推广预算
- 品质经理年终述职报告
- 手机摄影知识培训课件
- 2025年韩语TOPIK中级考试真题卷:写作技巧与范文解析及实战演练答案
- 2025年注册会计师考试《会计》新准则解读与练习试题
- 2025年音乐教师招聘考试音乐教育技术与应用试题卷
- 2025年小学英语毕业模拟试卷:英语歌曲欣赏与演唱能力评估
- 基床表层结构的作用
- 2025年室内设计师职业资格考试真题卷-装饰材料环保标准应用试题
- 中国儿童维生素A、维生素D临床应用专家共识(2024)解读
- 2023年社会工作者(初级)社会工作实务题库及答案(400题)
- 2024综合基础知识考试题库及解析(146题)
- 2024年城乡低保培训
- 215kWh工商业液冷储能电池一体柜用户手册
- 13J927-3 机械式停车库设计图册
- 读书分享《非暴力沟通》课件(图文)
- 装卸工安全培训课件
- 预防性侵安全教育课件
- 《钢铁是怎样炼成的》读书分享课件
- 颈椎损伤的固定与搬运操作流程课件
评论
0/150
提交评论