版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章代码优化8.1什么是代码优化8.2局部优化8.3循环优化8.4数据流分析第八章代码优化8.1什么是代码优化22022/12/238.1什么是代码优化1、优化:对程序进行各种等价变换,使变换后的程序能生成更有效的目标代码。优化可在编译的任何阶段进行,但最主要的一类优化是对中间代码进行优化。2、常见的优化方式①删除多余运算(又称删除公共子表达式)②代码外提:循环体中不变的运算提到循环体外③强度削弱:把乘法变成加法22022/12/198.1什么是代码优化1、优化:32022/12/23④变换循环控制条件:目的是删除那些纯粹为控制循环而设立的语句,因此又称删除归纳变量。⑤合并已知量:对于那些编译时便可静态确定的运算结果事先运算出来,不必等到运行程序时再执行。⑥复写传播:某些变量的值并未被改变,便赋给其他变量,则可直接引用原值本身。⑦删除无用赋值:有些变量在赋值后并未引用,却又被重新赋值了,称为无用赋值(前面的赋值)32022/12/19④变换循环控制条件:目的是删除那些42022/12/233、优化分类按阶段分:
与机器无关的优化---对中间代码进行依赖于机器的优化--对目标代码进行根据优化所涉及的程序范围分成:(1)局部优化:在程序基本块内进行的优化。
(2)循环优化:在程序循环体内进行的优化。
(3)全局优化:在整个程序范围内进行的优化。优化工作数据流分析(control-flowanalysis)
控制流分析(data-flowanalysis)变换(transformations)42022/12/193、优化分类按阶段分:52022/12/234、优化技术简介
1.删除多余运算
2.循环不变代码外提
3.强度削弱
4.变换循环控制条件
5.合并已知量与复写传播
6.删除无用赋值例:
P:=0forI:=1to20doP:=P+A[I]*B[I]52022/12/194、优化技术简介62022/12/23(1)P:=0(2)I:=1(3)T1:=4*I(4)T2:=addr(A)-4(5)T3:=T2[T1](6)T4:=4*I(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)(1)P:=0(2)I:=1(3)T1:=4*I(5)T3:=T2[T1](8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)ifI<=20goto(3)(4)T2:=addr(A)-4(7)T5:=addr(B)-4(6)T4:=T162022/12/19(1)P:=0(1)P:=0(4)T272022/12/23(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(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(5)(3)T1:=4*I(3‘)T1:=T1+472022/12/19(1)P:=0(1)P:=0(3)T182022/12/23(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(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3’)T1:=T1+4(12)if<=80goto(5)(3)T1:=4T1T182022/12/19(1)P:=0(1)P:=0(3)T192022/12/23(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[T1](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3’)T1:=T1+4(12)ifT1<=80goto(5)(1)P:=0(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4(5)T3:=T2[T1](8)T6:=T5[T1](9)T7:=T3*T6(10)P:=P+T7(3’)T1:=T1+4(12)ifT1<=80goto(5)92022/12/19(1)P:=0(1)P:=0102022/12/23对程序以基本块为范围来讨论的优化,称为局部优化。基本块:指程序中一顺序执行的语句序列,它只有一个入口语句和一个出口语句。基本块的入口语句:
1.程序的第一个语句;或者,
2.条件转移语句或无条件转移语句的转移目标语句;或者
3.紧跟在条件转移语句后面的语句。8.2局部优化:基本块内的优化102022/12/19对程序以基本块为范围来讨论的优化,称112022/12/23基本块的划分1、求基本块入口语句2、寻找基本块⑴从入口语句到下一入口语句(不包括该入口);⑵从入口语句到下一转移语句(包括转移语句);⑶从入口语句到下一停止语句(包括该停止语句)。3、基本块的整理程序中所有基本块之外的语句为无用语句,应删除。基本块优化在一个基本块内通常可实行三种优化:合并已知量、删除无用赋值(难判断)以及删除多余运算。112022/12/19基本块的划分122022/12/23例:
(1)
read(C)(2)A:=0(3)B:=1(4)L1:A:=A+B(5)ifB>=CgotoL2(6)B:=B+1(7)gotoL1(8)L2:write(A)(9)halt122022/12/19例:132022/12/23132022/12/19142022/12/23
基本块的DAG表示及其应用
DAGDirectedAcyclicGraph
无环路有向图基本块的DAG是在结点上带有标记的DAG
叶结点独特的标识符(名字,常数)标记内部结点运算符号标记各个结点附加标识符标记142022/12/19
基本块的DAG表示及其应用
DAG152022/12/23用DAG进行基本块的优化四元式DAG结点0型:A:=B(:=,B,—,A)n1
AB1型:A:=opB(op,B,
—,A)
n2Aopn1B2型:A:=BopC(op,B,C,A)n3Aop
n1n2BCn1n2n1n3n1n2152022/12/19用DAG进行基本块的优化四元式DAG162022/12/23162022/12/19172022/12/23172022/12/19182022/12/23182022/12/19192022/12/23例:192022/12/19例:202022/12/23202022/12/19212022/12/23212022/12/19222022/12/23222022/12/19232022/12/23232022/12/19242022/12/23242022/12/19252022/12/23252022/12/19262022/12/23262022/12/19272022/12/23272022/12/19282022/12/23282022/12/19292022/12/23控制流程图(流图):具有唯一首结点的有向图G=(N,E,n0)N:结点集
基本块集E:有向边集
n0:首结点
包含程序第一个
语句的基本块8.3循环优化292022/12/19控制流程图(流图):具有唯一首结点的302022/12/23302022/12/192022/12/232022/12/19322022/12/23322022/12/19332022/12/23332022/12/19342022/12/23分析程序流图中结点间的关系mDOMn定义在程序流图中,对任意两个结点m和n,如果从流图的首结点出发,到达n的任意通路都要经过m,则称m是n的必经结点,记为mDOMn(a,aMODa)必经结点集定义结点n的所有必经结点的集合,称为结点n的必经结点集,记为D(n).342022/12/19分析程序流图中结点间的关系352022/12/23例:
6734
1235761212121必经结点
必经结点集D(1)={1}D(2)={1,2}D(3)={1,2,3}D(4)={1,2,4}D(5)={1,2,4,5}D(6)={1,2,4,6}D(7)={1,2,4,7}3352022/12/19例:673412362022/12/23循环的查找循环的查找算法回边:假设a→b是流图中的一条有向边,如果bDOMa,则称a→b是流图中的一条回边。有向边n→d是回边,组成的循环是由结点d,结点n以及有通路到达n而该通路不经过d的所有结点组成,并且d是该循环的唯一入口结点。循环(结点序列的性质)1.强连通的(任意两结点间,必有一条通路,且该通路上各结点都属于该结点序列)2.它们中间有且只有一个是入口结点.362022/12/19循环的查找循环的查找算法回边:假设a372022/12/238.4数据流分析1.活跃变量数据流方程2.到达--定值数据流方程3.讨论数据流问题分类路径数据流方程解不唯一372022/12/198.4数据流分析1.活跃变量数382022/12/23活跃变量的数据流分析所谓活跃变量就是它的当前值还将被引用(在赋予一个新值之前)。在全局范围来分析的话,一个变量是活跃的,如果存在一条路径使得该变量被重新定值之前它的当前值还要被引用。通过全局活跃变量分析,识别出其当前值不再活跃(即,它的值已经死了)的那些变量。死变量的值在基本块的出口处不需要保存。382022/12/19活跃变量的数据流分析所谓活跃变量就是392022/12/23令B为一个基本块,定义LiveIn(B)为在基本块B入口处为活跃的变量的集合。定义LiveOut(B)为基本块B的出口处的活跃变量的集合。LiveIn和LiveOut并不是相互独立的,令S(B)为流图中基本块B的后继的集合,则有LiveOut(B)=∪LiveIn(i)i∈s(B)
如果基本块没有后继,则其LiveOut为空令LiveUse(B)为B中被定值之前要引用变量的集合。这个集合由基本块B中的语句唯一确定。容易看出,如果v∈LiveUse(B),则v∈LiveIn(B);即LiveIn(B)LiveUse(B)。令Def(B)为在B中定值的变量集合。如果一个变量在基本块B的出口处为活跃的且vDef(B),则它在B的入口处也是活跃的,即:LiveIn(B)LiveOut(B)-Def(B)因此有:LiveIn(B)=LiveUse(B)∪(LiveOut(B)-Def(B))即:一个变量在基本块入口处为活跃的,则一定有:或者它在基本块的LiveUse集中,或者它在基本块的出口处为活跃的且在基本块中没有重新定值
392022/12/19令B为一个基本块,402022/12/23a:=1;ifa=bthenb:=1elsec:=1endif;d:=a+ba:=1ifa=bgotoB2b:=1c:=1d:=a+bB1B2B3B4402022/12/19a:=1;a:=1b:=1c:=1d412022/12/23提取Def和LiveUse集合基本块DefLiveUseB1{a}{b}B2{b}ØB3{c}ØB4{d}{a,b}a:=1ifa=bgotoB2b:=1c:=1d:=a+bB1B2B3B4412022/12/19提取Def和LiveUse集合基本块422022/12/23从最后一个基本块开始由后往前计算,可以得到一定的解
LiveIn(B)=LiveUse(B)∪(LiveOut(B)-Def(B))
LiveOut(B)=∪LiveIn(i)i∈s(B)LiveOut(B4)=Ø,因此:LiveIn(B4)=LiveUse(B4)={a,b}-{d}现在LiveOut(B2)=LiveIn(B4)={a,b}-{d}LiveOut(B3)=LiveIn(B4)={a,b}-{d}LiveIn(B2)=LiveOut(B2)-Def(B2)={a,b}-{b}-{d}={a}-{d}LiveIn(B3)=LiveOut(B3)-Def(B3)={a,b}–{c}-{d}={a,b}–{c}-{d}LiveOut(B1)=LiveIn(B2)∪LiveIn(B3)={a}∪{a,b}-{d}={a,b}-{d}–{c}最后LiveIn(B1)=LiveUse(B1)∪(LiveOut(B1)-Def(B1))={b}∪({a,b}–{c}-{d}–{a})={b}-{d}–{c}
a:=1ifa=bgotoB2b:=1c:=1d:=a+bB1B2B3B4422022/12/19从最后一个基本块开始由后往前计算,可432022/12/23分析程序中所有变量的定值和引用之间的关系到达--定值数据流方程OUT[B]=(IN[B]-KILL[B])GEN[B]IN[B]=OUT[p]pP[B]P[B]:B的所有前驱基本块GEN[B]:B中定值并到达B出口之后的所有定值点集.KILL[B]:B之外的那些定值点集,其定值的变量在B中又重新定值.IN[B]:到B入口之前(紧)的各变量的所有定值点集OUT[B]:到达B出口之后(紧)各变量的所有定值点集.432022/12/19分析程序中所有变量的定值和引用之间的442022/12/23442022/12/19452022/12/23GEN位向量KILLB1{d1,d2}11000000011100B2{d3}00100001000000B3{d4}00010000100100B4{d5}00001000101000B5{}00000000000000IN[B]OUT[B]B101111001100000B211111000111100B301111000011000B400110000010100B500111000011100452022/12/19GEN位向量KILLB1{d1,d2462022/12/23462022/12/19472022/12/23472022/12/19482022/12/23
入口结点
••
循环L••
前置结点入口结点
•••
循环L•482022/12/19492022/12/23492022/12/19502022/12/2312345502022/12/1912345512022/12/23512022/12/19522022/12/23B1B2B3
B4B5(1)I:=1I:=3;(2)ifx<ygoto(3)(3)I:=2(4)x:=x+1(5)y:=y-1(6)ify<=20
gotoB2(7)J:=I522022/12/19532022/12/23B1B2B3
B4B5(1)I:=1(2)ifx<ygoto(3)(3)I:=2(4)x:=x+1(5)k:=I;y:=y-1(6)ify<=20
gotoB2(7)J:=I532022/12/19542022/12/23当把循环中的不变运算s:A:=BopC外提时注意:(2)
要求循环中其它地方不再有A的定值点。(3)
要求循环中A的所有引用点都是而且仅仅是这个定值所能达到的(1)要求s所在结点是循环的所有出口结点的必经结点(4)要求A在离开循环之后不再是活跃的542022/12/19当把循环中的不变运算s:A:=Bo552022/12/23中南大学软件学院陈志刚数据流问题的讨论合流问题向前流(forward-flow)(信息流的方向与控制流是一致的)和向后流(backward–flow)对每个基本块有一个IN集合和一个Out集合,在同一基本块中,In和Out集合的关系对于向前流问题:Out(B)=Used(B)∪(In(B)–Killed(B))对于向后流问题:In(B)=Used(B)∪(Out(B)–Killed(B))作为一个边界条件,向前流问题中的起始基本块的In和向后流问题中最后一个基本块的Out集合必须指明,通常,这些边界条件集或者为空,或者包含所有可能的值,因问题而定。如:到达--定值数据流方程
OUT[B]=(IN[B]-KILL[B])GEN[B]活跃变量数据流方程LiveIn(B)=LiveUse(B)∪(LiveOut(B)-Def(B))552022/12/19中南大学软件学院陈志刚数据流问题562022/12/23数据流问题的讨论路径问题任意路径数据流分析讨论的数据流假定这么一个性质,即某条路径为真,(如果存在某条路径上被引用这个变量就认为是活跃的;如果存在任何一条路径上被定值,则就认为这个变量是被定值的)。这种数据流问题被称为任意路径问题。任意路径问题的解不能保证所需的性质一定会满足,仅仅是可能满足。全路径数据流分析数据流问题也可以用全路径(all-path)形式来解决,使所需的性质在所有可能的路径都满足。对于全路径问题的解,所需的性质可以保证总是满足。
562022/12/19数据流问题的讨论路径问题任意路径数据572022/12/23数据流问题的解不一定唯一考察图10.20的流图,其中有一个简单的循环。在这个流图中,没有对任何变量定值,a在B4中被引用。应用向后流方法传播可以得到一个最明显的解,即四个基本块的LiveIn集合均为{a}。但是,不太合理的解也是可能的。。572022/12/19数据流问题的解不一定唯一考察图10.582022/12/23若Def(B1)=
Def(B2)=
Def(B3)=
Def(B4)=Liveuse(B1)=Liveuse(B1)=Liveuse(B1)=Liveuse(B1)={a}则最明显的解:LiveIn(B1)=LiveIn(B1)=LiveIn(B1)=LiveIn(B1)={a}B1B2B3B4582022/12/19若B1B2B3B4592022/12/23例如,下面解是满足数据流方程的:基本块LiveInLiveOutB1{a,b}{a,b}B2{a,b}{a,b}B3{a,b}{a,b}B4{a}Ø注意b没有在任何基本块中被引用!问题所在是基本块B2和B3互为祖先;而且,因为b从未定值(所有Def集为空),一旦b被包括在LiveIn集合中,它就永远消除不了592022/12/19例如,下面解是满足数据流方程的:基本第八章代码优化8.1什么是代码优化8.2局部优化8.3循环优化8.4数据流分析第八章代码优化8.1什么是代码优化612022/12/238.1什么是代码优化1、优化:对程序进行各种等价变换,使变换后的程序能生成更有效的目标代码。优化可在编译的任何阶段进行,但最主要的一类优化是对中间代码进行优化。2、常见的优化方式①删除多余运算(又称删除公共子表达式)②代码外提:循环体中不变的运算提到循环体外③强度削弱:把乘法变成加法22022/12/198.1什么是代码优化1、优化:622022/12/23④变换循环控制条件:目的是删除那些纯粹为控制循环而设立的语句,因此又称删除归纳变量。⑤合并已知量:对于那些编译时便可静态确定的运算结果事先运算出来,不必等到运行程序时再执行。⑥复写传播:某些变量的值并未被改变,便赋给其他变量,则可直接引用原值本身。⑦删除无用赋值:有些变量在赋值后并未引用,却又被重新赋值了,称为无用赋值(前面的赋值)32022/12/19④变换循环控制条件:目的是删除那些632022/12/233、优化分类按阶段分:
与机器无关的优化---对中间代码进行依赖于机器的优化--对目标代码进行根据优化所涉及的程序范围分成:(1)局部优化:在程序基本块内进行的优化。
(2)循环优化:在程序循环体内进行的优化。
(3)全局优化:在整个程序范围内进行的优化。优化工作数据流分析(control-flowanalysis)
控制流分析(data-flowanalysis)变换(transformations)42022/12/193、优化分类按阶段分:642022/12/234、优化技术简介
1.删除多余运算
2.循环不变代码外提
3.强度削弱
4.变换循环控制条件
5.合并已知量与复写传播
6.删除无用赋值例:
P:=0forI:=1to20doP:=P+A[I]*B[I]52022/12/194、优化技术简介652022/12/23(1)P:=0(2)I:=1(3)T1:=4*I(4)T2:=addr(A)-4(5)T3:=T2[T1](6)T4:=4*I(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)(1)P:=0(2)I:=1(3)T1:=4*I(5)T3:=T2[T1](8)T6:=T5[T4](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(12)ifI<=20goto(3)(4)T2:=addr(A)-4(7)T5:=addr(B)-4(6)T4:=T162022/12/19(1)P:=0(1)P:=0(4)T2662022/12/23(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(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(5)(3)T1:=4*I(3‘)T1:=T1+472022/12/19(1)P:=0(1)P:=0(3)T1672022/12/23(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(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3’)T1:=T1+4(12)if<=80goto(5)(3)T1:=4T1T182022/12/19(1)P:=0(1)P:=0(3)T1682022/12/23(1)P:=0(2)I:=1(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4(5)T3:=T2[T1](6)T4:=T1(8)T6:=T5[T1](9)T7:=T3*T6(10)P:=P+T7(11)I:=I+1(3’)T1:=T1+4(12)ifT1<=80goto(5)(1)P:=0(4)T2:=addr(A)-4(7)T5:=addr(B)-4(3)T1:=4(5)T3:=T2[T1](8)T6:=T5[T1](9)T7:=T3*T6(10)P:=P+T7(3’)T1:=T1+4(12)ifT1<=80goto(5)92022/12/19(1)P:=0(1)P:=0692022/12/23对程序以基本块为范围来讨论的优化,称为局部优化。基本块:指程序中一顺序执行的语句序列,它只有一个入口语句和一个出口语句。基本块的入口语句:
1.程序的第一个语句;或者,
2.条件转移语句或无条件转移语句的转移目标语句;或者
3.紧跟在条件转移语句后面的语句。8.2局部优化:基本块内的优化102022/12/19对程序以基本块为范围来讨论的优化,称702022/12/23基本块的划分1、求基本块入口语句2、寻找基本块⑴从入口语句到下一入口语句(不包括该入口);⑵从入口语句到下一转移语句(包括转移语句);⑶从入口语句到下一停止语句(包括该停止语句)。3、基本块的整理程序中所有基本块之外的语句为无用语句,应删除。基本块优化在一个基本块内通常可实行三种优化:合并已知量、删除无用赋值(难判断)以及删除多余运算。112022/12/19基本块的划分712022/12/23例:
(1)
read(C)(2)A:=0(3)B:=1(4)L1:A:=A+B(5)ifB>=CgotoL2(6)B:=B+1(7)gotoL1(8)L2:write(A)(9)halt122022/12/19例:722022/12/23132022/12/19732022/12/23
基本块的DAG表示及其应用
DAGDirectedAcyclicGraph
无环路有向图基本块的DAG是在结点上带有标记的DAG
叶结点独特的标识符(名字,常数)标记内部结点运算符号标记各个结点附加标识符标记142022/12/19
基本块的DAG表示及其应用
DAG742022/12/23用DAG进行基本块的优化四元式DAG结点0型:A:=B(:=,B,—,A)n1
AB1型:A:=opB(op,B,
—,A)
n2Aopn1B2型:A:=BopC(op,B,C,A)n3Aop
n1n2BCn1n2n1n3n1n2152022/12/19用DAG进行基本块的优化四元式DAG752022/12/23162022/12/19762022/12/23172022/12/19772022/12/23182022/12/19782022/12/23例:192022/12/19例:792022/12/23202022/12/19802022/12/23212022/12/19812022/12/23222022/12/19822022/12/23232022/12/19832022/12/23242022/12/19842022/12/23252022/12/19852022/12/23262022/12/19862022/12/23272022/12/19872022/12/23282022/12/19882022/12/23控制流程图(流图):具有唯一首结点的有向图G=(N,E,n0)N:结点集
基本块集E:有向边集
n0:首结点
包含程序第一个
语句的基本块8.3循环优化292022/12/19控制流程图(流图):具有唯一首结点的892022/12/23302022/12/192022/12/232022/12/19912022/12/23322022/12/19922022/12/23332022/12/19932022/12/23分析程序流图中结点间的关系mDOMn定义在程序流图中,对任意两个结点m和n,如果从流图的首结点出发,到达n的任意通路都要经过m,则称m是n的必经结点,记为mDOMn(a,aMODa)必经结点集定义结点n的所有必经结点的集合,称为结点n的必经结点集,记为D(n).342022/12/19分析程序流图中结点间的关系942022/12/23例:
6734
1235761212121必经结点
必经结点集D(1)={1}D(2)={1,2}D(3)={1,2,3}D(4)={1,2,4}D(5)={1,2,4,5}D(6)={1,2,4,6}D(7)={1,2,4,7}3352022/12/19例:673412952022/12/23循环的查找循环的查找算法回边:假设a→b是流图中的一条有向边,如果bDOMa,则称a→b是流图中的一条回边。有向边n→d是回边,组成的循环是由结点d,结点n以及有通路到达n而该通路不经过d的所有结点组成,并且d是该循环的唯一入口结点。循环(结点序列的性质)1.强连通的(任意两结点间,必有一条通路,且该通路上各结点都属于该结点序列)2.它们中间有且只有一个是入口结点.362022/12/19循环的查找循环的查找算法回边:假设a962022/12/238.4数据流分析1.活跃变量数据流方程2.到达--定值数据流方程3.讨论数据流问题分类路径数据流方程解不唯一372022/12/198.4数据流分析1.活跃变量数972022/12/23活跃变量的数据流分析所谓活跃变量就是它的当前值还将被引用(在赋予一个新值之前)。在全局范围来分析的话,一个变量是活跃的,如果存在一条路径使得该变量被重新定值之前它的当前值还要被引用。通过全局活跃变量分析,识别出其当前值不再活跃(即,它的值已经死了)的那些变量。死变量的值在基本块的出口处不需要保存。382022/12/19活跃变量的数据流分析所谓活跃变量就是982022/12/23令B为一个基本块,定义LiveIn(B)为在基本块B入口处为活跃的变量的集合。定义LiveOut(B)为基本块B的出口处的活跃变量的集合。LiveIn和LiveOut并不是相互独立的,令S(B)为流图中基本块B的后继的集合,则有LiveOut(B)=∪LiveIn(i)i∈s(B)
如果基本块没有后继,则其LiveOut为空令LiveUse(B)为B中被定值之前要引用变量的集合。这个集合由基本块B中的语句唯一确定。容易看出,如果v∈LiveUse(B),则v∈LiveIn(B);即LiveIn(B)LiveUse(B)。令Def(B)为在B中定值的变量集合。如果一个变量在基本块B的出口处为活跃的且vDef(B),则它在B的入口处也是活跃的,即:LiveIn(B)LiveOut(B)-Def(B)因此有:LiveIn(B)=LiveUse(B)∪(LiveOut(B)-Def(B))即:一个变量在基本块入口处为活跃的,则一定有:或者它在基本块的LiveUse集中,或者它在基本块的出口处为活跃的且在基本块中没有重新定值
392022/12/19令B为一个基本块,992022/12/23a:=1;ifa=bthenb:=1elsec:=1endif;d:=a+ba:=1ifa=bgotoB2b:=1c:=1d:=a+bB1B2B3B4402022/12/19a:=1;a:=1b:=1c:=1d1002022/12/23提取Def和LiveUse集合基本块DefLiveUseB1{a}{b}B2{b}ØB3{c}ØB4{d}{a,b}a:=1ifa=bgotoB2b:=1c:=1d:=a+bB1B2B3B4412022/12/19提取Def和LiveUse集合基本块1012022/12/23从最后一个基本块开始由后往前计算,可以得到一定的解
LiveIn(B)=LiveUse(B)∪(LiveOut(B)-Def(B))
LiveOut(B)=∪LiveIn(i)i∈s(B)LiveOut(B4)=Ø,因此:LiveIn(B4)=LiveUse(B4)={a,b}-{d}现在LiveOut(B2)=LiveIn(B4)={a,b}-{d}LiveOut(B3)=LiveIn(B4)={a,b}-{d}LiveIn(B2)=LiveOut(B2)-Def(B2)={a,b}-{b}-{d}={a}-{d}LiveIn(B3)=LiveOut(B3)-Def(B3)={a,b}–{c}-{d}={a,b}–{c}-{d}LiveOut(B1)=LiveIn(B2)∪LiveIn(B3)={a}∪{a,b}-{d}={a,b}-{d}–{c}最后LiveIn(B1)=LiveUse(B1)∪(LiveOut(B1)-Def(B1))={b}∪({a,b}–{c}-{d}–{a})={b}-{d}–{c}
a:=1ifa=bgotoB2b:=1c:=1d:=a+bB1B2B3B4422022/12/19从最后一个基本块开始由后往前计算,可1022022/12/23分析程序中所有变量的定值和引用之间的关系到达--定值数据流方程OUT[B]=(IN[B]-KILL[B])GEN[B]IN[B]=OUT[p]pP[B]P[B]:B的所有前驱基本块GEN[B]:B中定值并到达B出口之后的所有定值点集.KILL[B]:B之外的那些定值点集,其定值的变量在B中又重新定值.IN[B]:到B入口之前(紧)的各变量的所有定值点集OUT[B]:到达B出口之后(紧)各变量的所有定值点集.432022/12/19分析程序中所有变量的定值和引用之间的1032022/12/23442022/12/191042022/12/23GEN位向量KILLB1{d1,d2}11000000011100B2{d3}00100001000000B3{d4}00010000100100B4{d5}00001000101000B5{}00000000000000IN[B]OUT[B]B101111001100000B211111000111100B301111000011000B400110000010100B500111000011100452022/12/19GEN位向量KILLB1{d1,d21052022/12/23462022/12/191062022/12/23472022/12/191072022/12/23
入口结点
••
循环L••
前置结点入口结点
•••
循环L•482022/12/191082022/12/23492022/12/191092022/12/2312345502022/12/19123451102022/12/23512022/12/191112022/12/23B1B2B3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度餐饮泔水回收与环保设施投资合同3篇
- 二零二五年矿山土地及资源使用权转让合同3篇
- 二零二五版白糖进口许可证申请代理服务合同下载2篇
- 二零二五年度驾驶员押运员安全责任及培训合同3篇
- 二零二五版企事业单位节能环保办公电脑采购合同2篇
- 二零二五版电子商务平台借款及库存商品质押合同3篇
- 二零二五年纺织原料市场调研与分析合同2篇
- 小区下水管网清理疏通承包合同(2篇)
- 二零二五版房产买卖合同含抵押权转移及贷款利率协商协议0183篇
- 2025年度农业科技推广财产赠与合同3篇
- 部编新改版语文一年级下册《语文园地四》教学设计
- 2025年北京铁路局集团招聘笔试参考题库含答案解析
- 《药品招商营销概论》课件
- 曙光磁盘阵列DS800-G10售前培训资料V1.0
- 寺庙祈福活动方案(共6篇)
- 2025年病案编码员资格证试题库(含答案)
- 企业财务三年战略规划
- 2025新译林版英语七年级下单词表
- 提高脓毒性休克患者1h集束化措施落实率
- 山东省济南市天桥区2024-2025学年八年级数学上学期期中考试试题
- 主播mcn合同模板
评论
0/150
提交评论