《编译原理课程教案》第7章:代码优化.ppt

上传人:wuy****n92 文档编号:90700805 上传时间:2023-05-17 格式:PPT 页数:56 大小:498.50KB
返回 下载 相关 举报
《编译原理课程教案》第7章:代码优化.ppt_第1页
第1页 / 共56页
《编译原理课程教案》第7章:代码优化.ppt_第2页
第2页 / 共56页
点击查看更多>>
资源描述

《《编译原理课程教案》第7章:代码优化.ppt》由会员分享,可在线阅读,更多相关《《编译原理课程教案》第7章:代码优化.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、代码优化代码优化第十章第十章 本章要求本章要求主要内容主要内容:代码优化的主要功能,局代码优化的主要功能,局部优化、全局优化和循环优化的相关部优化、全局优化和循环优化的相关概念,各种优化技术概念,各种优化技术重点掌握:重点掌握:代码优化技术,基本块、代码优化技术,基本块、流图、流图、DAG的概念,必经结点、回边、的概念,必经结点、回边、循环的概念,各种优化技术。循环的概念,各种优化技术。代码优代码优化化所地所地位和作位和作用:用:7.1概述概述实际上很多地方可以对代码的执行效率进行改进,主要讲对中间代码的优化代码优化:对程序进行等价变换,使得从变换后的程代码优化:对程序进行等价变换,使得从变换

2、后的程序出发,能够生成更有效的目标代码。序出发,能够生成更有效的目标代码。优化分类优化分类按阶段分按阶段分:与机器无关的优化与机器无关的优化-对中间代码进行对中间代码进行 依赖于机器的优化依赖于机器的优化-对目标代码进行对目标代码进行根据优化所涉及的程序范围分成根据优化所涉及的程序范围分成:(1)(1)局部优化局部优化:(:(基本块基本块)(2)(2)循环优化循环优化:对循环中的代码进行优化对循环中的代码进行优化 (3)(3)全局优化全局优化:大范围的优化大范围的优化 优化的原则优化的原则等价原则:不改变运行结果等价原则:不改变运行结果有效原则:优化后时间更短,占用空间更少有效原则:优化后时间

3、更短,占用空间更少合算原则:应用较低的代价取得较好的优化效果合算原则:应用较低的代价取得较好的优化效果 宗旨:宗旨:获得较好性能的代码(时间,空间)获得较好性能的代码(时间,空间)等价等价意图、结果之间要权衡意图、结果之间要权衡中间代码优化技术中间代码优化技术优化工作 数据流分析(control-flow analysis)控制流分析(data-flow analysis)变换(transformations)快速排序程序快速排序程序void quicksort(int m,int n)int i,j,v,x;if(nm)return;i=m-1;j=n;v=an;while(1)doi=i+

4、1;while(aiv);if(i=j)break;x=ai;ai=aj;aj=x;x=ai;ai=an;an=x;quicksort(m,j);quicksort(i+1,n);(1)i:=m 1(2)j:=n(3)T1:=4*n(4)v:=aT1(5)i:=i+1(6)T2:=4*i(7)T3:=aT2(8)if T3 v goto(9)(13)if i=j goto(23)(14)T6:=4*i(15)x:=aT6(16)T7:=4*i(17)T8:=4*j(18)T9:=aT8(19)aT7:=T9(20)T10:=4*j(21)aT10:=x(22)goto(5)(23)T11:=4

5、*j(24)x:=aT11(25)T12:=4*i(26)T13:=4*n(27)T14:=aT13(28)aT12:=T14(29)T15:=4*n(30)aT15:=x中间代码7.2基本块的优化基本块的优化 基本块基本块:是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句,入口是其第一个语句,出口是其最后一个语句 如果x:=y+z 则称对x定值定值,引用引用y和z 在一个基本块内的一个名字,在程序中的某个给定点是活跃活跃的,是指如果在程序中它的值在该点之后被引用.入口语句:入口语句:1程序的第一个语句;或者,程序的第一个语句;或者,2条件转移语句或无条件转移语句的转移目标条

6、件转移语句或无条件转移语句的转移目标语句(语句(此处的转移语句包括各种控制的转向,如此处的转移语句包括各种控制的转向,如call,return,end,stop等)等);或者;或者3紧跟在条件转移语句后面的语句。紧跟在条件转移语句后面的语句。执行:执行:对于一个基本块,执行时只能从其入口进入,对于一个基本块,执行时只能从其入口进入,从其出口退出从其出口退出划分基本块的算法划分基本块的算法求出四元式程序之中各个基本块的入口语句求出四元式程序之中各个基本块的入口语句对每一入口语句,构造其所属的基本块。它对每一入口语句,构造其所属的基本块。它是由该语句到下一入口语句(不包括下一入口是由该语句到下一入

7、口语句(不包括下一入口语句),或到一转移语句(包括该转移语句),语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的语句序或到一停语句(包括该停语句)之间的语句序列组成的。列组成的。凡未被纳入某一基本块的语句,都是程序中凡未被纳入某一基本块的语句,都是程序中控制流程无法到达的语句,因而也是不会被执控制流程无法到达的语句,因而也是不会被执行到的语句,可以把它们删除。行到的语句,可以把它们删除。一般把过程调用语句作为一个单独的基本块一般把过程调用语句作为一个单独的基本块*(1)readx(2)readyB1*(3)r:=xmody(4)ifr=0goto(8)B2*(5)x

8、:=y(6)y:=r(7)goto(3)B3*(8)writey(9)haltB4例:例:*(1)readx(2)ready*(3)r:=xmody(4)ifr=0goto(8)*(5)x:=y(6)y:=r(7)goto(3)*(8)writey(9)halt 流图:有向图。将控制流的信息增加到基本块的集合上来表示一个程序。流图以基本块为单位。如果按顺序执行,就画一条有向边。基本块间的关系:(前驱,后继)B1是B2的前驱前驱,B2是B1的后继后继:有一个条件或无条件转移语句从B1的最后一条语句转移到B2的第一条语句;或者 在程序的序列中,B2紧接在B1的后面,并且B1的最后一条语句不是一个无

9、条件转移语句。*(1)readx(2)ready*(3)r:=xmody(4)ifr=0goto(8)*(5)x:=y(6)y:=r(7)goto(3)*(8)writey(9)halt练习练习 f0=0 f1=1 if m=1 goto L3 i=2L1:if i=m goto L3L2:f2=f0+f1 f0=f1 f1=f2 i=i+1 goto L1L3:return m12345f0=0f1=1if m=1 goto L3i=2L1:if i=m goto L3L2:f2=f0+f1f0=f1f1=f2i=i+1goto L1L3:return m1234512345f0=0f1=1

10、if m=1 goto L3i=2L1:if i=m goto L3L2:f2=f0+f1f0=f1f1=f2i=i+1goto L1L3:return m12345以快速排以快速排序的序的C C代码代码为例:为例:void quicksort(int m,int n)int i,j,v,x;if(nm)return;i=m-1;j=n;v=an;while(1)doi=i+1;while(aiv);if(i=j)break;x=ai;ai=aj;aj=x;x=ai;ai=an;an=x;quicksort(m,j);quicksort(i+1,n);各种代码优化技术:各种代码优化技术:快速排

11、序程序快速排序程序的中间代码的中间代码i=m-1;j=n;v=an;while(1)doi=i+1;while(aiv);if(i=j)break;x=ai;ai=aj;aj=x;x=ai;ai=an;an=x;优化技术优化技术1删除公共子表达式删除公共子表达式如果表达式E已经在前面计算过,并在计算之后E的值没有改变,则称该表达式为公共子表达式。可以避免重复计算。T6:=4*iT6:=4*ix=aT6x=aT6T7:=T7:=4*i4*iT8:=4*jT8:=4*jT9=aT8T9=aT8aT7:=T9aT7:=T9T10:=T10:=4*j4*jaT10:=xaT10:=xgoto B2go

12、to B2T6:=4*iT6:=4*ix=aT6x=aT6T7:=T6T7:=T6T8:=4*jT8:=4*jT9=aT8T9=aT8aT7:=T9aT7:=T9T10:=T8T10:=T8aT10:=xaT10:=xgoto B2goto B24*i,4*j重复计算在更大的范围内删除4*i,4*j的计算,得到:优化技术优化技术2复写传播复写传播T6:=T2T6:=T2x=T3x=T3T7:=T2T7:=T2T8:=T4T8:=T4T9=T5T9=T5aT2:=T5aT2:=T5T10:=T4T10:=T4aT4:=T3aT4:=T3goto B2goto B2T6:=T2T6:=T2x=aT

13、6x=aT6T7:=T6T7:=T6T8:=T4T8:=T4T9=aT8T9=aT8aT7:=T9aT7:=T9T10:=T8T10:=T8aT10:=xaT10:=xgoto B2goto B2T6:=T2,x=aT6,之间没有改变T6,因此,可以直接写x=aT2在B2中T3:=aT2因此,x=T3优化技术优化技术3删除无用代码删除无用代码aT2:=T5aT2:=T5aT4:=T3aT4:=T3goto B2goto B2T6:=T2T6:=T2x=T3x=T3T7:=T2T7:=T2T8:=T4T8:=T4T9=T5T9=T5aT2:=T5aT2:=T5T10:=T4T10:=T4aT4:

14、=T3aT4:=T3goto B2goto B2某些变量的赋值无用,在后面的程序中不再有用aT2:=vaT2:=vaT1:=T3aT1:=T3B5B6优化技术优化技术4对程序进行代数恒等对程序进行代数恒等变换(降低运算强度)变换(降低运算强度)a)i*2=2*i=i+i=i2b)i/2=(int)(i*0.5)c)0-1=-1d)f*2=2.0*f=f+fe)f/2.0=f*0.5优化技术简介优化技术简介对程序进行代对程序进行代数恒等变换(代数简化)数恒等变换(代数简化)x+0=x0+x=xx*1=x1*x=x0/x=0 x-0=xb&true=bb&false=falseb|true=tru

15、eb|false=b优化技术简介优化技术简介对程序进行代对程序进行代数恒等变换(合并已知量)数恒等变换(合并已知量)T1:=2T2:=4*T1 T1:=2T2:=8 优化技术优化技术5代码外提代码外提对循环中的有些代码,如果它产生的结果在循环中是不变的,可以提到循环外面while(i=limit-2).t=limit-2while(iv goto B3if T5v goto B3T4=T4-4T4=T4-4T5=aT4T5=aT4if T5v goto B3if T5v goto B3B3J每次减1后再做乘4操作改为先赋值后,T4的计算用减法运算T4=4*jT4=4*j优化技术优化技术7删除归

16、纳变量删除归纳变量当进行强度削弱后,B4中i,j的比较可以使用T2,T4If T2=T4 goto B6基本块的基本块的DAGDAG表示及其应用表示及其应用DAG Directed Acyclic Graph有向无环路图有向无环路图基本块的DAG是在结点上带有标记的DAGDAG表示了基本块的计算过程表示了基本块的计算过程叶结点表示标识符或常数的值,以标识符或叶结点表示标识符或常数的值,以标识符或常数作为标记常数作为标记内部结点以运算符作为标记,表示运算结果内部结点以运算符作为标记,表示运算结果边表示了操作间的前驱和后继的关系边表示了操作间的前驱和后继的关系每个结点:附加标识符标记,可以是一个或

17、每个结点:附加标识符标记,可以是一个或多个标识符都具有该结点代表的值多个标识符都具有该结点代表的值用用DAG进行基本块的优化进行基本块的优化(0)x:=y(1)x:=op y(2)x:=y op z 基本块的基本块的DAGDAG构造算法构造算法:首先,DAG为空。对基本块的每一四元式,依次执行1,2,3,4步:1.如果NODE(B)无定义,则构造一标记为B的叶结点并定义NODE(B)为这个结点;如果当前四元式是0型,则记NODE(B)的值为n,转4。如果当前四元式是1型,则转2(1)。如果当前四元式是2型,则:(1)如果NODE(C)无定义,则构造一标记为C的叶结点并定义NODE(C)为这个结

18、点;(2)转2(2)2.(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。置NO

19、DE(P)=n,转4。3.(1)检查DAG中是否已有一结点,其唯一后继为NODE(B),且标记为op(即找公共子表达式)。如果没有,则构造该结点n,否则就把已有的结点作为它的结点并设该结点为n,转4。(2)检查中DAG中是否已有一结点,其左后继为NODE(B),其右后继为NODE(C),且标记为op(即找公共子表达式)。如果没有,则构造该结点n,否则就把已有的结点作为它的结点并设该结点为n,转4。4.如果NODE(A)无定义,则把A附加在结点n上并令NODE(A)=n;否则先把A从NODE(A)结点上附加标识符集中删除(注意,如果NODE(A)是叶结点,则其标记A不删除),把A附加到新结点n上

20、并令NODE(A)=n。转处理下一四元式。这样,就可由DAG重新生成原基本块的一个优化的代码序列。例:求下列基本块的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(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(2)T1:=2*T0(3)T2:=

21、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(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(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 DAG的应用的应用根据DA

22、G图,可以更进一步实现优化:合并已知量,如T1,T3删除冗余赋值,如B的第一次赋值公共子表达式的提取,如T2和T4在基本块外被定值并在基本块内被引用的所有标识符,就是作为叶结点上标记的那些标识符在基本块内被定值且该值能在基本块后面被引用的所有标识符,就是DAG各结点上的那些附加标识符(1)T1:=R+r(2)A:=6.28*T1(3)T2:=R-r(4)B:=S*T2 简化后的代码序列简化后的代码序列循环:程序中可能反复执行的代码序列循环:程序中可能反复执行的代码序列,也是也是优化的重点优化的重点7.3循环优化循环优化程序流图中结点间的关系程序流图中结点间的关系m DOM n m DOM n

23、定义定义 在程序流图中,对任意两个结点m和n,如果从流图的首结点出发,到达n的任意通路都要经过m,则称m是n的必经结点,记为m DOM n 每个结点是它本身的必经结点;循环的入口是循环中所有结点的必经结点。必经结点集必经结点集定义定义 结点n的所有必经结点的集合,称为结点n的必经结点集,记为D(n).例:例:D(1)=1D(2)=1,2D(3)=1,2,3。D(4)=1,2,4D(5)=1,2,4,5 D(6)=1,2,4,6 D(7)=1,2,4,7循环的查找算法循环的查找算法回边:假设回边:假设ab是流图中的一条有向边,如果是流图中的一条有向边,如果bDOMa,则称,则称ab是流图中的一条

24、回边。是流图中的一条回边。循环的查找循环的查找如果有向边如果有向边ndnd是回边,组成的循环是由结点是回边,组成的循环是由结点d,结,结点点 n以及有通路到达以及有通路到达n而该而该通路不经过通路不经过d的所有结点组的所有结点组成,并且成,并且d是该循环的唯一入口结点。是该循环的唯一入口结点。回边 6 6 循环6 7 4 4,5,6,7 4 2 2,3,4,5,6,7循环(结点序列的性质)1.强连通的(任意两结点间,必有一条通路,且该通路上各结点都属于该结点序列)2.它们中间有且只有一个是入口结点。循环优化循环优化循环优化的关键哪些基本块构成一个循环循环优化的方法代码外提强度削弱删除归纳变量循

25、环的性质循环的性质两个循环的关系:图中任意两个循环要么是嵌套的,要么不相交(可能有公共的入口结点)内循环:不包含任何其它循环的循环如果两个自然循环有相同的首结点,且两个循环不是一个嵌在另一个里面时,可以考虑将二者合并,当成是一个循环B0B1B2B3变量A在某点d的定值到达另一点u,是指流图中从d由一通路到达u且该通路上没有A的其他定值代码外提代码外提把循环不变计算提到循环外面,在入口结点的把循环不变计算提到循环外面,在入口结点的前面创建一个新的基本块,叫做前面创建一个新的基本块,叫做前置结点前置结点。前置结点唯一的后继是前置结点唯一的后继是L的首结点的首结点将原来从将原来从L外到达外到达L首结

26、点的边都改成进入前首结点的边都改成进入前置结点置结点从从L内到达入口结点的边不变内到达入口结点的边不变forI:=1to10doAI,2*J:=AI,2*J+1(1)I:=1(2)If I10 goto 15(3)T1:=2*J(4)T2:=10*I(5)T3:=T2+T1(6)T4:=addr(A)-11(7)T5:=2*J(8)T6:=10*I(9)T7:=T6+T5(10)T8:=addr(A)-11(11)T9:=T8T7(12)T4T3:=T9+1(13)I:=I+1(14)goto B2(15)B1B2B3(1)I:=1(2)If I10 goto 15(4)T2:=10*I(5)

27、T3:=T2+T1(8)T6:=10*I(9)T7:=T6+T5(11)T9:=T8T7(12)T4T3:=T9+1(13)I:=I+1(14)goto B2(15)B1B2B3(3)T1:=2*J(6)T4:=addr(A)-11(7)T5:=2*J(10)T8:=addr(A)-11并不是所有情况下,循环中的不变运算都可以外提。右图中的B3块中的I:=2是不变运算,但不能外提,因为它并不是所有结点的必经结点。强度削弱强度削弱是指把程序中执行时间长的运算替换为执行时间较短的运算(1)I:=1(2)If I10 goto 15(4)T2:=10*I(5)T3:=T2+T1(8)T6:=10*I

28、(9)T7:=T6+T5(11)T9:=T8T7(12)T4T3:=T9+1(13)I:=I+1(14)goto B2(15)B1B2B3(3)T1:=2*J(6)T4:=addr(A)-11(7)T5:=2*J(10)T8:=addr(A)-11强度削弱的方法?删除归纳变量删除归纳变量基本归纳变量:如果循环中对变量I只有唯一的形如I:=I c的赋值,c是循环不变量归纳变量:如果I是循环中的基本归纳变量,J在循环中的赋值总是可以化为I的同一线性函数,即J:=C1*I c2。同时称J与I同族一个基本归纳变量除用于自身的递归定值外,一般在循环中用来计算其他归纳变量及控制循环的进行,此时,可以用与它同族的某一归纳变量来控制循环的进行删除归纳变量一般是在强度削弱以后进行的(1)I:=1(2)If I10 goto 15(4)T2:=10*I(5)T3:=T2+T1(8)T6:=10*I(9)T7:=T6+T5(11)T9:=T8T7(12)T4T3:=T9+1(13)I:=I+1(14)goto B2(15)B1B2B3(3)T1:=2*J(6)T4:=addr(A)-11(7)T5:=2*J(10)T8:=addr(A)-11

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁