![代码优化讲义_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/1efea7da-e385-4bd5-a969-35d6a35e512e/1efea7da-e385-4bd5-a969-35d6a35e512e1.gif)
![代码优化讲义_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/1efea7da-e385-4bd5-a969-35d6a35e512e/1efea7da-e385-4bd5-a969-35d6a35e512e2.gif)
![代码优化讲义_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/1efea7da-e385-4bd5-a969-35d6a35e512e/1efea7da-e385-4bd5-a969-35d6a35e512e3.gif)
![代码优化讲义_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/1efea7da-e385-4bd5-a969-35d6a35e512e/1efea7da-e385-4bd5-a969-35d6a35e512e4.gif)
![代码优化讲义_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/1efea7da-e385-4bd5-a969-35d6a35e512e/1efea7da-e385-4bd5-a969-35d6a35e512e5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7章章 代码优化代码优化学习目标:学习目标:掌握:基本块的划分、基本块的掌握:基本块的划分、基本块的DAG优化优化理解:什么是局部优化、循环优化、全局优化理解:什么是局部优化、循环优化、全局优化了解:循环优化技术了解:循环优化技术7.1 优化技术简介优化技术简介什么是优化:什么是优化:所谓优化是对代码进行等价变换,使得变换后所谓优化是对代码进行等价变换,使得变换后的代码的效率更高(节省运行时间、存储空间的代码的效率更高(节省运行时间、存储空间或两者兼而有之)或两者兼而有之)优化可在编译的不同阶段进行,最主要的优化优化可在编译的不同阶段进行,最主要的优化有有 中间代码优化中间代码优化(不依赖
2、具体计算机)(不依赖具体计算机) 目标代码优化目标代码优化(依赖于具体计算机)(依赖于具体计算机)中间代码优化中间代码优化中间代码中间代码源代码源代码编译前端编译前端代码生成代码生成目标代码目标代码目标代码优化目标代码优化编译的优化工作阶段编译的优化工作阶段优化的分类:优化的分类:根据优化涉及的程序范围,分为:根据优化涉及的程序范围,分为: 局部优化局部优化:在只有一个入口、一个出口的基:在只有一个入口、一个出口的基 本块上进行优化本块上进行优化 循环优化循环优化:对循环中的代码进行优化:对循环中的代码进行优化 全局优化全局优化:在整个程序范围内进行的优化:在整个程序范围内进行的优化中间代码优
3、化常用技术中间代码优化常用技术1. 删除多余运算删除多余运算(删除公共子表达式)(删除公共子表达式)如果子表达式如果子表达式E在前面计算过,且之后在前面计算过,且之后E中的变中的变量值都未改变,那么量值都未改变,那么E的重复出现称为公共子的重复出现称为公共子表达式,可避免重复计算表达式,可避免重复计算(1)和和(4)中都有中都有4*I的运算,的运算, (1)到到(4)之间无对之间无对I的的赋值,显然赋值,显然两次计算的值是相等的,两次计算的值是相等的, (4)的运算是多余的的运算是多余的例例(1) T1 :=4*I(2) T2 :=addr(A)4(3) T3 :=T2T1(4) T4 :=4
4、*I (5) (4)变换成变换成T4 :=T12. 合并已知量与复写传播合并已知量与复写传播如果运算量都是已知量,则在编译时就算出它的值,如果运算量都是已知量,则在编译时就算出它的值,称为称为合并已知量合并已知量若有若有A:=B,称为把称为把B值值复写复写到到A。如果其后有引用如果其后有引用A的地方,且其间的地方,且其间A、B的的值都未改变,则可把对值都未改变,则可把对A的的引用改为对引用改为对B引用,称为引用,称为复写传播复写传播。例:例:(1)I:=1(2)T1:=4*I (3)T4:=T1(4)T6:=T5T4 I是已知量是已知量把把T1的值复写到的值复写到T4(4)T6:=T5T1 复
5、写传播复写传播(2)T1:=4 合并已知量合并已知量3. 删除无用赋值删除无用赋值有些变量的赋值从未被引用,称为无用赋值,应删除。有些变量的赋值从未被引用,称为无用赋值,应删除。无用赋值分三种情况:无用赋值分三种情况: 变量被赋值,但在程序中从未被引用(在局部范变量被赋值,但在程序中从未被引用(在局部范围内难判定)围内难判定) 变量赋值后未被引用又重新赋值,则前面赋值是变量赋值后未被引用又重新赋值,则前面赋值是无用的无用的 变量的赋值只被计算变量自己引用,其他变量都变量的赋值只被计算变量自己引用,其他变量都不引用它不引用它例例 (1) I:=1(2)T1:=4(3)T3:=T2T1(4)T4:
6、=T1 (5)I:=I+1(6)T1:=T1+4(7)if T180 goto (3)(4)中对中对T4赋值,但赋值,但T4未被引用;未被引用;(1)和和(5)对对I赋值,但只有赋值,但只有(5)中计算中计算I时引用时引用I如果程序其他地方不需要引用如果程序其他地方不需要引用T4和和I,则则(4)、(1)和和(5)是是无用赋值,可删除。无用赋值,可删除。(2)T1:=4(3)T3:=T2 T1(6)T1:=T1+4(7)if T180 goto (3)4. 其他优化技术其他优化技术以下优化技术将在循环优化中介绍:以下优化技术将在循环优化中介绍: 代码外提代码外提强度削弱强度削弱变换循环控制条件
7、变换循环控制条件(删除归纳变量)(删除归纳变量)7.2 局部优化局部优化局部优化是指基本块内的优化局部优化是指基本块内的优化基本块基本块是指程序中一顺序执行的语句序列,其是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句。执行时中只有一个入口语句和一个出口语句。执行时只能从入口语句进入,从其出口语句退出只能从入口语句进入,从其出口语句退出7.2.1 基本块的划分基本块的划分把程序(中间代码形成)划分成基本块的算法:把程序(中间代码形成)划分成基本块的算法:1. 求基本块的求基本块的入口语句入口语句,它们是:,它们是:1) 程序的第一个语句;或者程序的第一个语句;或者2) 条件转
8、移条件转移或或无条件转移无条件转移语句的转移目标语句;语句的转移目标语句;或者或者3) 紧跟在紧跟在条件转移条件转移语句后面的语句。语句后面的语句。2对每一入口语句,构造其所属的基本块对每一入口语句,构造其所属的基本块:它是由该入口语句到下一入口语句它是由该入口语句到下一入口语句(不包括下不包括下一入口语句一入口语句);或到一转移语句或到一转移语句(包括该转移语句包括该转移语句);或到一停止语句或到一停止语句(包括该停止语句包括该停止语句)之间的语句序列组成的。之间的语句序列组成的。3凡未被纳入某一基本块的语句,是不会被执凡未被纳入某一基本块的语句,是不会被执行到的语句,可以把它们删除。行到的
9、语句,可以把它们删除。例:例: (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)、(3)、(5)和和(8)是入口是入口语句,分别构成基本块语句,分别构成基本块B1 (1)、(2) B2 (3)、(4) B3 (5)、(6)、(7) B4 (8)、(9) (1) read X(3) R:=X mod Y (5) X:=Y(8) write Y7.2.2 基本块的基本块的DAG表示表示DAG(Directed Acyclic Graph)
10、是无环路有向图的简称是无环路有向图的简称1. 基本块的基本块的DAG是一种其结点带有标记或附加信息的是一种其结点带有标记或附加信息的DAG:1) 叶结点叶结点(无后继的结点无后继的结点)以一标识符或常数作以一标识符或常数作标记标记,表示该结点代表该变量或常数的值表示该结点代表该变量或常数的值2) 内部结点内部结点(有后继的结点有后继的结点)以一运算符作以一运算符作标记标记,表示,表示该结点代表用该算符对其后继结点所代表的值进行该结点代表用该算符对其后继结点所代表的值进行运算的结果运算的结果3) 各结点都可以各结点都可以附加附加上一个或多个上一个或多个标识符标识符,表示这些,表示这些变量具有该结
11、点所代表的值变量具有该结点所代表的值基本块的基本块的DAG的例子的例子1) T0:=3.142) T1:=2*T03) T2:=R+r4) A:=T1*T25) B:=A6) T3:=2*T07) T4:=R+r8) T5:=T3*T49) T6:=Rr10) B:=T5*T6+rT6A, B,T5*T1,T3T0R6.28 3.14T2,T4n5n7n2n3n4n1B*n6n8ni是结点编号是结点编号结点下面的符号(运算符、标识符或常量)结点下面的符号(运算符、标识符或常量)是各结点的标记是各结点的标记结点右边的标识符是结点的附加标识符结点右边的标识符是结点的附加标识符2. 四元式及其相应的
12、四元式及其相应的DAG结点形式结点形式0型型: A:=B (:=, B, ,A) B n1A n2 n1opBA 1型型: A:=op B (op , B, ,A) 2型型:A:=B op C (op , B , C , A) n3n1n2 BCopA3 构造基本块的构造基本块的DAG的算法的算法算法准备:算法准备:假定假定DAG各结点信息将用适当的各结点信息将用适当的数据结构数据结构来存放,来存放,并设有一个标识符(包括常数)与结点的并设有一个标识符(包括常数)与结点的对应表对应表。NODE(A)是描述这种对应关系的函数,它的值或为是描述这种对应关系的函数,它的值或为n(表示结点表示结点n上
13、有上有A作为标记或附加标识符),或无作为标记或附加标识符),或无定义。定义。算法:算法:首先首先DAG为空,对基本块的每一四元式,按其类型为空,对基本块的每一四元式,按其类型分别处理:分别处理:对对0型(型(A:= B)YNNYNODE(B)有定义有定义构造叶结点构造叶结点B令该结点为令该结点为nNODE(A)有定义有定义从从NODE(A)的附加标的附加标识符中删去识符中删去A在结点在结点n上附加上附加A下一四元式下一四元式nBA对对1型(型(A:= op B)YYNNYNYNYNYN NODE(B)有定义有定义构造叶结点构造叶结点BNODE(B)标记常数标记常数执行执行op B 得得P有标记
14、为有标记为op后继为后继为NODE(B)的结点的结点NODE(B)为新结点为新结点删除删除NODE(B)结点结点NODE(P)有定义有定义构造叶结点构造叶结点P构造该结点构造该结点从从NODE(A)的附加的附加标识符中删去标识符中删去A令该结点为令该结点为nNODE(A)有定义有定义在结点在结点n上附加上附加A下一四元式下一四元式npAnBopA对于对于2型(型(A:= B op C)YYNNN 删除删除NODE(C)结点结点NODE(C)是新结点是新结点NODE(P)有定义有定义 构造叶结点构造叶结点PYNYNYNYYN下一四元式下一四元式 执行执行B op C得得PNODE(B)是新结点是
15、新结点 删除删除NODE(B)结点结点NODE(B),NODE(C)均标记常数均标记常数N NODE(B)有定义有定义 构造叶结点构造叶结点B 构造叶结点构造叶结点C NODE(C)有定义有定义有标记为有标记为op后继为后继为N O D E ( B ) 、NODE(C)的结点的结点 构造该结点构造该结点Y 令该结点为令该结点为nNODE(A)有定义有定义 从从NODE(A)的附加标识符中删去的附加标识符中删去A 在结点在结点n上附加上附加AnBCopAnAp例:构造以下基本块的例:构造以下基本块的DAG(1) T0:=3.14 (2) T1:=2*T0(3) T2:=R+r(4) A:=T1*
16、T2 (5) B:=A(6) T3:=2*T0(7) T4:=R+r(8) T5:=T3*T4(9) T6:=Rr(10) B:=T5*T6 T6,T5,T3T0,T46.28n2Rn3rn43.14n1B*n6*n8n7+n52T1T2A ,B27.2.3 DAG的应用的应用在一个基本块被构造成相应的在一个基本块被构造成相应的DAG的过程中的过程中,进行了如下基本的优化工作:进行了如下基本的优化工作:1) 合并已知量合并已知量在在DAG构造算法中构造算法中,如果运算量都是已知量,如果运算量都是已知量,则不生成计算该结点值的内部结点,而执行则不生成计算该结点值的内部结点,而执行该运算,将计算结
17、果生成一个叶结点,实现该运算,将计算结果生成一个叶结点,实现了合并已知量优化了合并已知量优化2)删除多余运算删除多余运算对具有公共子表达式的所有四元式,只生成对具有公共子表达式的所有四元式,只生成一个计算该表达式的内部结点,所有被赋值一个计算该表达式的内部结点,所有被赋值的变量都作为该结点的附加标识符,实现了的变量都作为该结点的附加标识符,实现了删除多余运算的优化删除多余运算的优化3)删除无用赋值删除无用赋值如果变量被赋值后,在它被引用前又被重新如果变量被赋值后,在它被引用前又被重新赋值,则变量被从具有前一个值的结点上删赋值,则变量被从具有前一个值的结点上删除除+rT6A, T5*T1,T3T
18、0R6.283.14T2,T4n5n7n2n3n4n1B*n6n8(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 :=Rr(9) B :=A*T6 由由DAG重新生成原基本块的一个优重新生成原基本块的一个优化的代码序列:化的代码序列:原基本块的四元式序列原基本块的四元式序列G(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*T
19、4(9) T6:=Rr(10) B:=T5*T6 按按DAG重新写成的四元式序列重新写成的四元式序列G(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 :=Rr(9) B :=A*T6 G中中(2)(6)的已知量已的已知量已合并合并G中中(5)的无用赋值已的无用赋值已删除删除G中中(3)(7)的公共子表达式的公共子表达式R+r 只计算一次只计算一次,删除了多余运算,删除了多余运算利用利用DAG进行优化进行优化删除在基本块后不被引用变量的赋值删除在基本块后不被
20、引用变量的赋值rR6.283.14+T6A, T5*T1,T3T0T2,T4n5n7n2n3n4n1B*n6n8假如假如T0,T1,T6在基本块后在基本块后都不被引用都不被引用,则这些符号可在则这些符号可在DAG附加标识符中删去,重写四附加标识符中删去,重写四元式得到进一步的优化:元式得到进一步的优化:(1) S1:=R+r(2) A:=6.28*S1(3) S2:=Rr(4) B:=A*S2其中其中S1和和S2是临时变量。是临时变量。 T0,T1,T6被赋值的代码被被赋值的代码被优化掉优化掉7.3 循环优化简介循环优化简介循环就是程序中那些可能反复执行的代码序列。循环就是程序中那些可能反复执
21、行的代码序列。因为循环中的代码要反复执行,所以循环的代因为循环中的代码要反复执行,所以循环的代码优化对提高目标代码的效率将起更大的作用。码优化对提高目标代码的效率将起更大的作用。7.3.1 程序流图程序流图把控制流的信息加到基本块集合上构成的有向图把控制流的信息加到基本块集合上构成的有向图称为表示程序的流图,简称称为表示程序的流图,简称流图流图。流图的构造方法:流图的构造方法: 点集点集:以基本块为结点,含程序第一条语句的结:以基本块为结点,含程序第一条语句的结点为首结点。点为首结点。 边集边集:从基本块:从基本块Bi向基本块向基本块Bj引引有向边,仅当有向边,仅当1) Bj在在程序中的位置紧
22、跟在程序中的位置紧跟在Bi之后之后, 且且Bi的出口语的出口语句不是无条件转移语句或停止语句。句不是无条件转移语句或停止语句。或者或者2) Bi的出口是转移语句的出口是转移语句 (goto (s)或或ifgoto (s),并且转移目标并且转移目标(s)是是Bj的入口语句。的入口语句。例:构造以下程序的流图例:构造以下程序的流图(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(
23、4) if R=0 goto (8)(5) X:=Y(6) Y:=R(7) goto (3)(8) write Y(9) halt7.3.2 循环优化循环优化1. 代码外提代码外提把循环不变运算,即其结果独立于循环执行次把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面,使之只在循环数的表达式,提到循环的前面,使之只在循环外计算一次,这种优化称为代码外提。外计算一次,这种优化称为代码外提。循环不变运算循环不变运算:运算量为常量或在循环外定值,:运算量为常量或在循环外定值,每次循环时其值不变的运算。每次循环时其值不变的运算。(1) P:=0(2) I:=1(3) T1:=4*I(
24、4) T2:=addr(A)4(5) T3:=T2T1(6) T4:=T1(7) T5:=addr(B) 4(8) T6:=T5T4(9) T7:=T3*T6(10) P:=P+T7(11) I:=I+1(12) if I20 goto (3)中间代码段中间代码段B1B2(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 I20 goto (3)代码外提后代码外提后B1B
25、2(4)中的运算量中的运算量addr(A)是分配是分配的数组的数组A的首地址,是个常的首地址,是个常量,量,4也是常量,因而也是常量,因而(4)是是循环不变运算,同样循环不变运算,同样(7)也是也是循环不变运算,循环不变运算,(4)、(7) 都都可提到循环前可提到循环前2. 强度削弱强度削弱强度削弱是指把程序中强度大的运算替换成强强度削弱是指把程序中强度大的运算替换成强度小的运算。例如把乘法运算换成加法运算等度小的运算。例如把乘法运算换成加法运算等(1) P:=0(2) I:=1(4) T2:=addr(A) 4(7) T5:=addr(B) 4(3) T1:=4*I(5) T3:=T2T1(
26、6) T4:=T1(8) T6:=T5T4(9) T7:=T3*T6(10) P:=P+T7(11) I:=I+1(12) If I20 goto (3)中间代码段中间代码段(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 I20 goto (5)强度削弱强度削弱I和和T1始终保持始终保持T1:=4*I的线的线性关系性关系这样把这样把(12)的循环控制条件的循环控制条件 I20变换成变换成
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年专业财务代理记账合作协议
- 2025年区域快递服务承包经营合同范本
- 2025年临时宿舍租赁协议书
- 2025年员工投资策划入股合作协议书
- 2025年区域间互惠协议规范
- 2025年云计算服务购销合同模板
- 2025年度股东垫付资金互助协议书模板
- 2025年信用协议示范文本索取
- 2025年个人经营店铺质押贷款合同样本
- 2025年企业人力资源专员聘用合同样本
- 三年级数学-解决问题策略(苏教版)
- 园艺疗法共课件
- DB33T 628.1-2021 交通建设工程工程量清单计价规范 第1部分:公路工程
- 医院-9S管理共88张课件
- 设立登记通知书
- 2022医学课件前列腺炎指南模板
- MySQL数据库项目式教程完整版课件全书电子教案教材课件(完整)
- 药品生产质量管理工程完整版课件
- 《网络服务器搭建、配置与管理-Linux(RHEL8、CentOS8)(微课版)(第4版)》全册电子教案
- 职业卫生教学课件生物性有害因素所致职业性损害
- 降“四高”健康教育课件
评论
0/150
提交评论