- 2.14 MB
- 2022-04-29 14:42:57 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'第1章咨询心理学心理咨询的含义
第11章代码优化学习目标:掌握:基本块的划分、基本块的DAG优化理解:什么是局部优化、循环优化、全局优化了解:循环优化技术
11.1优化技术简介11.2局部优化11.3循环优化简介
11.1优化技术简介什么是优化:所谓优化是对代码进行等价变换,使得变换后的代码的效率更高(节省运行时间、存储空间或两者兼而有之)优化可在编译的不同阶段进行,最主要的优化有中间代码优化(不依赖具体计算机)目标代码优化(依赖于具体计算机)
中间代码优化中间代码源代码编译前端代码生成目标代码目标代码优化编译的优化工作阶段
优化的分类:根据优化涉及的程序范围,分为:局部优化:在只有一个入口、一个出口的基本块上进行优化循环优化:对循环中的代码进行优化全局优化:在整个程序范围内进行的优化
中间代码优化常用技术1.删除多余运算(删除公共子表达式)如果子表达式E在前面计算过,且之后E中的变量值都未改变,那么E的重复出现称为公共子表达式,可避免重复计算
(1)和(4)中都有4*I的运算,(1)到(4)之间无对I的赋值,显然两次计算的值是相等的,(4)的运算是多余的例(1)T1:=4*I(2)T2:=addr(A)-4(3)T3:=T2[T1]T4:=4*I(5)……(4)变换成T4:=T1
2.合并已知量与复写传播如果运算量都是已知量,则在编译时就算出它的值,称为合并已知量若有A:=B,称为把B值复写到A。如果其后有引用A的地方,且其间A、B的值都未改变,则可把对A的引用改为对B引用,称为复写传播。例:(1)I:=1(2)T1:=4*I(3)T4:=T1(4)T6:=T5[T4]I是已知量把T1的值复写到T4(4)T6:=T5[T1]复写传播(2)T1:=4合并已知量
3.删除无用赋值有些变量的赋值从未被引用,称为无用赋值,应删除。无用赋值分三种情况:变量被赋值,但在程序中从未被引用(在局部范围内难判定)变量赋值后未被引用又重新赋值,则前面赋值是无用的变量的赋值只被计算变量自己引用,其他变量都不引用它
例(1)I:=1(2)T1:=4(3)T3:=T2[T1](4)T4:=T1(5)I:=I+1(6)T1:=T1+4(7)ifT1≤80goto(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)ifT1≤80goto(3)
4.其他优化技术以下优化技术将在循环优化中介绍:代码外提强度削弱变换循环控制条件(删除归纳变量)
11.2局部优化局部优化是指基本块内的优化基本块是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句。执行时只能从入口语句进入,从其出口语句退出
11.2.1基本块的划分把程序(中间代码形成)划分成基本块的算法:1.求基本块的入口语句,它们是:程序的第一个语句;或者条件转移或无条件转移语句的转移目标语句;或者紧跟在条件转移语句后面的语句。
2.对每一入口语句,构造其所属的基本块:它是由该入口语句到下一入口语句(不包括下一入口语句);或到一转移语句(包括该转移语句);或到一停止语句(包括该停止语句)之间的语句序列组成的。3.凡未被纳入某一基本块的语句,是不会被执行到的语句,可以把它们删除。
例:readXreadYR:=XmodYifR=0goto(8)X:=YY:=Rgoto(3)writeYhalt(1)、(3)、(5)和(8)是入口语句,分别构成基本块B1{(1)、(2)}B2{(3)、(4)}B3{(5)、(6)、(7)}B4{(8)、(9)}readXR:=XmodYX:=YwriteY
11.2.2基本块的DAG表示DAG(DirectedAcyclicGraph)是无环路有向图的简称1.基本块的DAG是一种其结点带有标记或附加信息的DAG:叶结点(无后继的结点)以一标识符或常数作标记,表示该结点代表该变量或常数的值内部结点(有后继的结点)以一运算符作标记,表示该结点代表用该算符对其后继结点所代表的值进行运算的结果各结点都可以附加上一个或多个标识符,表示这些变量具有该结点所代表的值
基本块的DAG的例子T0:=3.14T1:=2*T0T2:=R+rA:=T1*T2B:=AT3:=2*T0T4:=R+rT5:=T3*T4T6:=R-rB:=T5*T6-+rT6A,B,T5*T1,T3T0R6.283.14T2,T4n5n7n2n3n4n1B*n6n8ni是结点编号结点下面的符号(运算符、标识符或常量)是各结点的标记结点右边的标识符是结点的附加标识符
2.四元式及其相应的DAG结点形式0型:A:=B(:=,B,-,A)Bn1An2n1opBA1型:A:=opB(op,B,-,A)2型:A:=BopC(op,B,C,A)n3n1n2BCopA
3构造基本块的DAG的算法算法准备:假定DAG各结点信息将用适当的数据结构来存放,并设有一个标识符(包括常数)与结点的对应表。NODE(A)是描述这种对应关系的函数,它的值或为n(表示结点n上有A作为标记或附加标识符),或无定义。算法:首先DAG为空,对基本块的每一四元式,按其类型分别处理:
对0型(A:=B)YNNYNODE(B)有定义构造叶结点B令该结点为nNODE(A)有定义从NODE(A)的附加标识符中删去A在结点n上附加A下一四元式nBA
对1型(A:=opB)YYNNYNYNYNYNNODE(B)有定义构造叶结点BNODE(B)标记常数执行opB得P有标记为op后继为NODE(B)的结点NODE(B)为新结点删除NODE(B)结点NODE(P)有定义构造叶结点P构造该结点从NODE(A)的附加标识符中删去A令该结点为nNODE(A)有定义在结点n上附加A下一四元式npAnBopA
对于2型(A:=BopC)YYNNN删除NODE(C)结点NODE(C)是新结点NODE(P)有定义构造叶结点PYNYNYNYYN下一四元式执行BopC得PNODE(B)是新结点删除NODE(B)结点NODE(B),NODE(C)均标记常数NNODE(B)有定义构造叶结点B构造叶结点CNODE(C)有定义有标记为op后继为NODE(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*T2(5)B:=A(6)T3:=2*T0(7)T4:=R+r(8)T5:=T3*T4(9)T6:=R-r(10)B:=T5*T6T6,T5,T3T0,T46.28n2Rn3rn43.14n1B*n6*n8-n7+n52T1T2A,B2
11.2.3DAG的应用在一个基本块被构造成相应的DAG的过程中,进行了如下基本的优化工作:合并已知量在DAG构造算法中,如果运算量都是已知量,则不生成计算该结点值的内部结点,而执行该运算,将计算结果生成一个叶结点,实现了合并已知量优化
删除多余运算对具有公共子表达式的所有四元式,只生成一个计算该表达式的内部结点,所有被赋值的变量都作为该结点的附加标识符,实现了删除多余运算的优化删除无用赋值如果变量被赋值后,在它被引用前又被重新赋值,则变量被从具有前一个值的结点上删除
-+rT6A,T5*T1,T3T0R6.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:=R-r(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*T4(9)T6:=R-r(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:=R-r(9)B:=A*T6G中(2)(6)的已知量已合并G中(5)的无用赋值已删除G中(3)(7)的公共子表达式R+r只计算一次,删除了多余运算
利用DAG进行优化删除在基本块后不被引用变量的赋值rR6.283.14-+T6A,T5*T1,T3T0T2,T4n5n7n2n3n4n1B*n6n8假如T0,T1,…,T6在基本块后都不被引用,则这些符号可在DAG附加标识符中删去,重写四元式得到进一步的优化:(1)S1:=R+r(2)A:=6.28*S1(3)S2:=R-r(4)B:=A*S2其中S1和S2是临时变量。T0,T1,…,T6被赋值的代码被优化掉
11.3循环优化简介循环就是程序中那些可能反复执行的代码序列。因为循环中的代码要反复执行,所以循环的代码优化对提高目标代码的效率将起更大的作用。
11.3.1程序流图把控制流的信息加到基本块集合上构成的有向图称为表示程序的流图,简称流图。流图的构造方法:点集:以基本块为结点,含程序第一条语句的结点为首结点。边集:从基本块Bi向基本块Bj引有向边,仅当Bj在程序中的位置紧跟在Bi之后,且Bi的出口语句不是无条件转移语句或停止语句。或者Bi的出口是转移语句(goto(s)或if…goto(s)),并且转移目标(s)是Bj的入口语句。
例:构造以下程序的流图(1)readX(2)readY(3)R:=XmodY(4)ifR=0goto(8)(5)X:=Y(6)Y:=R(7)goto(3)(8)writeY(9)halt(1)readX(2)readY(3)R:=XmodY(4)ifR=0goto(8)(5)X:=Y(6)Y:=R(7)goto(3)(8)writeY(9)halt
11.3.2循环优化1.代码外提把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面,使之只在循环外计算一次,这种优化称为代码外提。循环不变运算:运算量为常量或在循环外定值,每次循环时其值不变的运算。
(1)P:=0(2)I:=1(3)T1:=4*I(4)T2:=addr(A)-4(5)T3:=T2[T1](6)T4:=T1(7)T5:=addr(B)-4(8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)ifI≤20goto(3)中间代码段B1B2(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)IfI≤20goto(3)代码外提后B1B2(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:=T2[T1](6)T4:=T1(8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)IfI≤20goto(3)中间代码段(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3’)T1:=T1+4(12)ifI≤20goto(5)强度削弱
I和T1始终保持T1:=4*I的线性关系这样把(12)的循环控制条件I≤20变换成T1≤80,程序的运行结果不变这种变换称为变换循环控制条件经过这一变换,循环中I的值不被引用,四元式(11)可被删去,这是变换的目的所在。(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3’)T1:=T1+4(12)ifI≤20goto(5)变换循环控制条件
(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(3’)T1:=T1+4(12)ifT1≤80goto(5)变换循环控制条件中间代码段(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4*I(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3’)T1:=T1+4(12)ifI≤20goto(5)
本章小结主要讨论在中间代码级别上进行的优化优化的种类:局部优化、循环优化、全局优化基本块内的优化删除公共子表达式、合并已知量、复写传播、删除无用赋值借助DAG进行基本块的优化循环优化代码外提、强度削弱、变换循环控制条件'
您可能关注的文档
- 最新第16章 螺旋体课件PPT.ppt
- 最新第16章 螺旋体62440课件PPT.ppt
- 最新第17少年闰土657课件PPT.ppt
- 最新第18周--重叠问题1课件PPT.ppt
- 最新第17课宋朝的建立及其制度创设-修改课件PPT.ppt
- 最新第18篇-门静脉高压症病人护理课件PPT.ppt
- 最新第18章-止咳平喘药课件PPT.ppt
- 最新第18课-中国社会主义经济建设的曲折发展课件PPT课件.ppt
- 最新第19章--金属通论课件PPT.ppt
- 最新第1单元—数一数(1)课件PPT.ppt
- 最新第1章--解表药-第2节(1)课件PPT.ppt
- 最新第1章-Java开发入门课件PPT.ppt
- 最新第1章-绪论课件PPT.ppt
- 最新第1章matlab语言的基础知识及入门课件PPT.ppt
- 最新第1章引论.课件PPT.ppt
- 最新第1章护理学的发展史课件课件PPT.ppt
- 最新第1章小信号放大器2小信号放大器汇总课件PPT.ppt
- 最新第1章口腔颌面部发育 (杜长青)课件PPT.ppt