收藏 分享(赏)

第十章_优化.ppt

上传人:hskm5268 文档编号:5830209 上传时间:2019-03-19 格式:PPT 页数:75 大小:588.50KB
下载 相关 举报
第十章_优化.ppt_第1页
第1页 / 共75页
第十章_优化.ppt_第2页
第2页 / 共75页
第十章_优化.ppt_第3页
第3页 / 共75页
第十章_优化.ppt_第4页
第4页 / 共75页
第十章_优化.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

1、第十章 优化,内容,概述 局部优化 循环优化,第十章 优化,优化:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。 等价:指不改变程序的运行结果。 有效:指目标代码运行时间短,占用的存储空间小。,10.1 概述,优化的目的是为了产生更高效的代码。由优化编译程序提供的对代码的各种变换必须遵循一定的原则: 等价原则:经过优化后不应改变程序运行的结果; 有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小; 合算原则:应尽可能以较低的代价取得较好的优化效果。,10.1 概述,优化的种类: 删除公共子表达式 复写传播 删除无用代码 代码外提 强度消弱 删除归纳变量

2、 根据优化所涉及的程序范围,优化分成三个不同级别: 局部优化:(基本块) 循环优化:对循环中的代码进行优化 全局优化:大范围的优化,C语言写的快速排序子程序,void quicksort (m, n); int m, n; int i, j;int v, x;if (nv);if (i=j) break;x=a i; ai=a j; aj=x;x=ai; ai=a n; a n=x;/*fragment ends here*/quicksort (m, j); quicksort (i+1, n); ,中间代码程序段,删除公共子表达式后,复写传播,复写传播(一)后,复写传播(二)后,删除无用代

3、码,删除无用代码后,代码外提与强度削弱,代码外提与强度削弱后,删除归纳变量,删除归纳变量后,10.2 局部优化,基本块:指程序中一顺序执行语句序列,其中只有一个入口和一个出口。入口就是其中第一个语句,出口就是其中最后一个语句。,T1:=a*aT2:=a*bT3:=2*T2T4:=T1+T2T5:=b*bT6:=T4+T5,如果一条三地址语句为x:=y+z,则称对x定值并引用y和z。 在一个基本块中的一个名字,所谓在程序中的某个给定点是活跃的,是指如果在程序中(包括在本基本块或在其它基本块中)它的值在该点以后被引用。,10.2 局部优化,划分四元式程序为基本块的算法: 1. 求出四元式程序中各个

4、基本块的入口语句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。,10.2 局部优化,划分四元式程序为基本块的算法: 2. 对以上求出的每个入口语句,确定其所属的基本块。它是由该入口语句到下一入口语句(不包括该入口语句)、或到一转移语句(包括该转移语句)、或一停语句(包括该停语句)之间的语句序列组成的。 3. 凡未被纳入某一基本块中的语句,可以从程序中删除。,例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R

5、 (7) goto (3) (8) write Y (9) halt,例:划分基本块 (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,例:划分基本块 (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,例:划分基本块 (1) read X (2) read Y (

6、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,例:划分基本块 (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,10.2 局部优化,局限于基本块范围内的优化称为基本块内的优化,或称局部优化。 在一个基本块内通常可以实行下面的优化: 删除公共子表达式 删除无用赋值 合并已知量 临时变量改名 交换语句的位置

7、代数变换,10.2 局部优化,优化措施 删除无用赋值: 对某变量A赋值后,该变量A在程序中不被引用; 对某变量A赋值后,该A值被引用前又对A重新赋值; 对某变量A递归赋值,如A:=A+C,且该A值在程序中仅在此递归运算中被引用。,10.2 局部优化,优化措施 合并已知量T1:=2T2:=4*T1 变换成T2:=8 临时变量改名T:=b+c 其中T是一个临时变量名。把这个语句改成:S:=b+c,10.2 局部优化,优化措施 交换语句的位置T1:=b+c T2:=x+y 代数变换x:=x+0 或 x:=x*1x:=y*2 变换成 x:=y*y,10.2.1 基本块及流图,流图 每个流图以基本块为结

8、点。如果一个结点的基本块的入口语句是程序的第一条语句,则称此结点为首结点。如果在某个执行顺序中,基本块B2紧接在基本块B1之后执行,则从B1到B2有一条有向边。即,如果 有一个条件或无条件转移语句从B1的最后一条语句转移到B2的第一条语句;或者 在程序的序列中,B2紧接在B1的后面,并且B1的最后一条语句不是一个无条件转移语句。我们就说B1是B2的前驱,B2是B1的后继。,(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,10.

9、2.2 基本块的DAG表示及其应用,有向图 有向边: ninj 前驱:ni是nj的前驱 后继: nj是ni的后继 通路: n1n2 , n2n3 ,. ,nk-1nk 环路: n1=nk DAG:无环路有向图(Directed Acyclic Graph) 祖先、后代,10.2.2 基本块的DAG表示及其应用,描述计算过程的DAG是一种带有下述标记或附加信息的DAG: 1. 图的叶结点以一标识符或常数作为标记,表示该结点代表该变量或常数的值; 2. 图的内部结点以一运算符作为标记,表示该结点代表应用该运算符对其后继结点所代表的值进行运算的结果; 3. 图中各个结点上可能附加一个或多个标识符(称

10、附加标识符)表示这些变量具有该结点所代表的值。,基本块的DAG表示,一个基本块,可用一个DAG来表示与各四元式相对应的DAG结点形式:四元式 DAG 图,(0) 0型: A:=B(:=,B,-,A),四元式 DAG 图,(1) 1型: A:=op B(op,B,-,A),(2) 2型: A:=B op C (op,B,C,A),四元式 DAG 图,(3) 2型: A:=BC (=,BC,-,A),(4) 2型: if B rop C goto (s)(jrop,B,C,(s),四元式 DAG 图,(5) 3型: DC:=B(=,B,-,DC),(6) 0型: goto (s)(j,-,-,(s

11、),假设DAG各结点信息将用某种适当的数据结构存放(如链表)。另设置一个标识符与结点的对应函数:,0、1、2型四元式的 基本块的DAG构造算法,对基本块中每一四元式,依次执行以下步骤: 1. 如果NODE(B)无定义,则构造一标记为B的叶结点并定义NODE(B)为这个结点; 如果当前四元式是0型,则记NODE(B)的值为n,转4。 如果当前四元式是1型,则转2(1)。 如果当前四元式是2型,则(i)如果NODE(C)无定义,则构造一标记为C的叶结点并定义NODE(C)为这个结点;(ii)转2(2)。,0、1、2型四元式的 基本块的DAG构造算法,对基本块中每一四元式,依次执行以下步骤 2. (

12、1) 如果NODE(B)是标记为常数的叶结点,则转2(3);否则,转3(1)。 (2) 如果NODE(B)和NODE(C)都是标记为常数的叶结点,则转2(4);否则,转3(2)。 (3) 执行op B (即合并已知量)。令得到的新常数为P。如果NODE(B)是处理当前四元式时新构造出来的结点,则删除它。如果NODE(P)无定义,则构造一用P作标记的叶结点n。置NODE(P)=n,转4。 (4) 执行B op C (即合并已知量)。令得到的新常数为P。如果NODE(B)或NODE(C)是处理当前四元式时新构造出来的结点,则删除它。如果NODE(P)无定义,则构造一用P作标记的叶结点n。置NODE

13、(P)=n,转4。,0、1、2型四元式的 基本块的DAG构造算法,对基本块中每一四元式,依次执行以下步骤 3. (1) 检查DAG中是否已有一结点,其唯一后继为NODE(B)且标记为op(即公共子表达式)。如果没有,则构造该结点n,否则,把已有的结点作为它的结点并设该结点为n。转4。 (2) 检查DAG中是否已有一结点,其左后继为NODE(B),右后继为NODE(C),且标记为op(即公共子表达式)。如果没有,则构造该结点n,否则,把已有的结点作为它的结点并设该结点为n。转4。,0、1、2型四元式的 基本块的DAG构造算法,对基本块中每一四元式,依次执行以下步骤 4. 如果NODE(A)无定义

14、,则把A附加在结点n上并令NODE(A)=n;否则,先把A从NODE(A)结点上的附加标识符集中删除(注意,如果NODE(A)是叶结点,则其A标记部不删除)。把A附加到新结点n上并置NODE(A)=n。转处理下一四元式。,DAG的应用,例:试构造以下基本块G的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,n1,3.14,T0,n2,6.28,T1,n3,n4,

15、R,r,n5,+,T2,n6,*,A, B, T3, T4, T5,n7,T6,-,n8,*,B,(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,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,从DAG中还能得到其他的优化信息:

16、在基本块外被定值并在基本块内被引用的所有标识符,就是作为叶子结点上标记的那些标识符。 在基本块内被定值并且该值在基本块后面被引用的所有标识符,就是DAG各结点上的那些附加标识符。,DAG的应用,10.3 循环优化,对循环中的代码,可以实行: 代码外提 强度消弱 删除归纳变量(变换循环控制条件) 循环展开 循环合并,10.3.1 代码外提,循环不变运算: 对四元式A:=B op C,若B和C是常数,或者到达它们的B和C的定值点都在循环外。 所谓变量A在某点d的定值到达另一点u(或称变量A的定值点d到达另一点u),是指流图中从d有一通路到达u且该通路上没有A的其它定值。 把循环不变运算提到循环体外

17、。,10.3.1 代码外提,10.3.1 代码外提,代码外提条件for I:=1 to 10 doAI, 2*J := AI, 2*J + 1,X=30, Y=25 J=1, I=1,是否在任何情况下,都可把循环不变运算外提呢?,X=30, Y=25 J=2, I=2 代码外提条件:不变运算所在的结点是L所有出口结点的必经结点,考虑: B2 B3 B4 B2 B4 B5 I=3, J=3,考虑: B2 B3 B4 B2 B4 B5 I=2, J=2 代码外提条件: A在循环中其他地方未再定值,才能把循环不变运算A:=B op C外提,考虑: X=0, Y=2 B2 B3 B4 B2 B4 B5

18、 A=2, J=2,考虑: X=0, Y=2 B2 B3 B4 B2 B4 B5 A=3, J=3 S(A:=B OP C)外提条件:循环中所有A的引用点只有S中的A的定值才能到达。,查找循环L的不变运算的算法,1. 依次查看L中各基本块的每个代码,如果它的每个运算对象或为常数,或者定值点在 L外,则将此代码标记为“不变运算”; 2. 重复第3步直至没有新的代码被标记为“不变运算“为止; 3. 依次查看尚未被标记为“不变运算”的代码,如果它的每个运算对象或为常数,或定值点在L之外,或只有一个到达一定值点且该点上的代码已被标记为“不变运算“,则把被查看的代码标记为“不变运算“。,1. 求出L的所

19、有不变运算 2. 对每个不变运算s:A:=B op C或A:=op B或A:=B检查是否满足条件(1)或(2) (1) (i) s所在的结点是L所有出口结点的必经结点; (ii) A在L中其他地方未再定值; (iii) L中所有A的引用点只有s中的A的定值才能到达。,代码外提算法,(2) A在离开L后不再是活跃的,并且条件(1)的(ii)和(iii)成立。所谓A在离开L后不是活跃的是指,A在L的任何出口结点的后继结点的入口处不是活跃的。 3.按步骤1所找出的不变运算的次序,依次把符合条件2的条件(1)或(2)的不变运算s外提到L的前置结点中。但是,如果s的运算对象(B或C)是在L中定值的,那么

20、,只有当这些定值代码都已外提到前置结点中时,才能把s也外提到前置结点中。,代码外提算法,10.3.2 强度消弱,把程序中执行时间较长的运算转换为执行时间较短的运算。,10.3.2 强度消弱,强度消弱 强度消弱主要是对与归纳变量有线性关系的变量赋值进行; 经过强度消弱后,循环中可能出现一些新的无用赋值; 对于消弱下标变量地址计算的强度非常有效。,10.3.3 删除归纳变量,如果循环中对变量I只有唯一的形如I:=IC的赋值,且其中C为循环不变量,则称I为循环中的基本归纳变量。 如果I是循环中一基本归纳变量,J在循环中的定值总是可化归为I的同一线性函数,也即J=C1*IC2,其中C1和C2都是循环不

21、变量,则称J是归纳变量,并称它与I同族。 一个基本归纳变量也是一归纳变量。,10.3.3 删除归纳变量,删除归纳变量是在强度削弱以后进行的。强度削弱和删除归纳变量的统一算法框架,其步骤如下: 1. 利用循环不变运算信息,找出循环中所有基本归纳变量。 2. 找出所有其它归纳变量A,并找出A与已知基本归纳变量X的同族线性函数关系FA(X)。 3. 对2中找出的每一归纳变量A,进行强度削弱。 4. 删除对归纳变量的无用赋值。,10.3.3 删除归纳变量,删除归纳变量是在强度削弱以后进行的。强度削弱和删除归纳变量的统一算法框架,其步骤如下: 5. 删除基本归纳变量。如果基本归纳变量B在循环出口之后不是

22、活跃的,并且在循环中,除在其自身的递归赋值中被引用外,只在形如 if B rop Y goto L 中被引用,则可选取一与B同族的归纳变量M来替换B进行条件控制。最后删除循环中对B的递归赋值的代码。,小结,基本块 局部优化 循环优化,练习,例1:何谓代码优化?进行优化所需要的基础是什么? 解: 对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少,或两者都有。 优化所需要的基础是在中间代码生成之后或目标代码生成之后。,练习,例2:编译过程中可进行的优化如何分类?最常用的代码优化技术有哪些? 解: 依据优化所涉及的程序范围,可以分为:局部优化、循

23、环优化和全局优化。 最常用的代码优化技术有 1. 删除多余运算 2. 代码外提 3. 强度削弱 4. 变换循环控制条件 5. 合并已知量与复写传播 6. 删除无用赋值,练习,例3:试对以下基本块B2: B:=3 D:=A+C E:=A*C F:=D+E G:=B*F H:=A+C I:=A*C J:=H+I K:=B*5 L:=K+J M:=L应用DAG 对它们进行优化,并就以下两种情况分别写出优化后的四元式序列: (1)假设只有G、L、M 在基本块后面还要被引用。 (2)假设只有L 在基本块后面还要被引用。,练习,解: 基本块对应的DAG 如下: B:=3 D:=A+C E:=A*C F:=D+E G:=B*F H:=A+C I:=A*C J:=H+I K:=B*5 L:=K+J M:=L,练习,解: 优化后的四元式序列: 对假设1,只有G、L、M 在基本块后面还要被引用 B:=3 D:=A+C E:=A*C F:=D+E G:=B*F K:=B*5 L:=K+F M:=L,练习,解: 优化后的四元式序列: 对假设2,只有L 在基本块后面还要被引用 B:=3 D:=A+C E:=A*C F:=D+E K:=B*5 L:=K+F,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报