编译原理,清华大学,第2版_第11章 代码优化
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)P:=0 (2)I:=1 (4)T2:=addr(A) (7)T5:=addr(B) (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)if T1 <=80 goto(5)
入口语句n … … 入口语句m
2016/3/8 20
(2) 对以上求出的每个入口语句,确定其所 属的基本块。它是由该入口语句到下一入 口语句(不包括该入口语句)、或到一转移 语句(包括该转移语句) 之间的语句序列组 成的。
入口语句n … … 入口语句m
2016/3/8
入口语句n … … 转移语句m
(5)T3:=T2[T1] (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
11.2局部优化
一、基本块 1、定义 程序中一个只有一个入口和一个出口的一 段顺序执行的语句序列,称为程序的一个基 本块。 注:1)一个给定的程序,可以划分为一系列 的基本块。优化在各基本块中分别进行(局部 优化)。 2)在运行基本块时,只能从其入口进入 ,从出口退出。
21
(2)对以上求出的每个入口语句,确定其所属 的基本块。它是由该入口语句到下一入口 语句(不包括该入口语句)、或到一转移语 句(包括该转移语句) 、或一停语句(包括 该停语句)之间的语句序列组成的。
入口语句n … … 入口语句m
2016/3/8
入口语句n … … 转移语句m
入口语句n … … 停语句m
(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)if I<=20 goto(3)
4、变换循环控制条件
• 经过变换后,有些变量不被引用,可 以从循环中删除。
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (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)if I<=20 goto(5)
2016/3/8
15
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (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)if T1<=80 goto(5)
2、划分基本块算法
(1)求出各基本块的入口语句 1)程序的第一个语句 ; 2)能由条件转移语句和无条件转移语句转 移到达的语句;
3)紧跟在条件转移语句后面的语句。
(2) 对以上求出的每个入口语句,确定其所 属的基本块。它是由该入口语句到下一入 口语句(不包括该入口语句) 之间的语句序 列组成的。
1.求出四元式程序中各个基本块的入口语 句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
25
• 例:划分基本块 (1) (2) (3) (4) (5) (6) (7) (8) (9)
2016/3/8
read X read Y R:=X mod Y if R=0 goto (8) X:=Y Y:=R goto (3) write Y halt
变址取数
(3)T1:=4*I (4)T2:=addr(A)
(5)T3:=T2[T1] (6)T4:=4*I (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
2、代码外提
目的:减少循环中代码总数。 方法:把循环不变运算,即其结果独立 于循环执行次数的表达式提到循环的前 面,使之只在循环外计算一次。
3.强度削弱
•基本思想:把强度大的运算换算成强度 小的。例如:
a) i*2 = 2*i = i+i b) 0-1 = -1 c) f/2.0 = f*0.5
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B)
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (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)if I<=20 goto(5)
(1)P:=0 (2)I:=0 (3)T1:=4*I (4)T2:=addr(A) (5)T3:=T2[T1] (6)T4:=T1 (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (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)if I<=20 goto(3)
6.删除无用赋值
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0 (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5) (1)P:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
对上面第一和第三种情况,应进行全局分析。
二、基本块的DAG表示
1.求出四元式程序中各个基本块的入口语 句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
27
• 例:划分基本块 (1) (2) (3) (4) (5) (6) (7) (8) (9)
2016/3/8
read X read Y R:=X mod Y if R=0 goto (8) X:=Y Y:=R goto (3) write Y halt
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
1.求出四元式程序中各个基本块的入口 语句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
24
• 例:划分基本块 (1) (2) (3) (4) (5) (6) (7) (8) (9)
2016/3/8
read X read Y R:=X mod Y if R=0 goto (8) X:=Y Y:=R goto (3) write Y halt
1.求出四元式程序中各个基本块的入口语 句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
28
• 例:划分基本块 (1) (2) (3) (4) (5) (6) (7) (8) (9)
2016/3/8
read X read Y R:=X mod Y if R=0 goto (8) X:=Y Y:=R goto (3) write Y halt
2016/3/8
30
划分为四个基本块
(1) (2) (3) (4) (5)
(6) (7) (8) (9)
2016/3/8 31
3、块内优化
主要是进行已知量合并、删除公共子表达式、 删除无用赋值。
注:无用赋值有以下情形:
(a)对某变量A赋值后,在程序中没有引用; (b)对某变量A赋值后,在引用前又重新赋值; (c)对某变量A进行自增赋值,且它仅仅被用在自 增运算中。
第十一章
代码优化
• 11.1 优化技术简介 • 11.2 局部优化 • 11.3 控制流分析和循环优化
11.1 优化技术简介
一、优化的原则 1、等价原则 优化后不改变原程序运行的功能。 2、有效原则
优化后产生的目标代码运行时间较短,占 用空间较小。
二、优化阶段
源代码 中间代码 目标代码
中间代码优化 目标代码优化
22
(3)删除不会被执行的语句 凡是没有纳入到任何一个基本块中的语 句,都是程序控制流程所无法到达的语句 ,即不会被执行到的语句,可将其删除。
• 例:划分基本块 (1) (2) (3) (4) (5) (6) (7) (8) (9)
2016/3/8
read X read Y R:=X mod Y if R=0 goto (8) X:=Y Y:=R goto (3) write Y halt
5Biblioteka Baidu合并已知量与复写传播
• 编码时的已知量—常数,可在编译时 计算出它的值,这种变换称为合并已 知量或常数合并。 • 通过复制后没有再改变的值可以互相 替换,不会改变程序的结果,这种变 换称为复写传播。
复写传播
tmp2 = tmp1 ; tmp3 = tmp2 * tmp1; tmp4 = tmp3 ; tmp5 = tmp3 * tmp2 ; c = tmp5 + tmp4 ; tmp3 = tmp1 * tmp1 ; tmp5 = tmp3 * tmp1 ; c = tmp5 + tmp3 ;
1.删除多余运算(删除公共子表达式): 目的:提高目标代码速度。
例如:(假设数组元素占用空间为4个字 节) P:=0 for I:=1 to 20 do P:=P+A[I]*B[I]
(1)P:=0 (2)I:=0
(1)P:=0 (2)I:=0 (3)T1:=4*I (4)T2:=addr(A) (5)T3:=T2[T1] (6)T4:=T1 (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
1.求出四元式程序中各个基本块的入口语 句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
26
• 例:划分基本块 (1) (2) (3) (4) (5) (6) (7) (8) (9)
2016/3/8
read X read Y R:=X mod Y if R=0 goto (8) X:=Y Y:=R goto (3) write Y halt
•与机器无关的优化---中间代码优化。 •依赖于机器的优化---目标代码优化。
三、优化分类
(1)局部优化:对基本块内的代码进行优化
(2)循环优化:对循环中的代码进行优化 (3)全局优化:在整个程序范围内的优化
四、常用优化技术简介
1.删除多余运算 2.循环不变代码外提 3.强度削弱 4.变换循环控制条件 5.合并已知量与复写传播 6.删除无用赋值
2. 对以上求出的 每个入口语句, 确定其所属的基 本块。它是由该 入口语句到下一 入口语句(不包括 该入口语句)、或 到一转移语句(包 括该转移语句)、 或一停语句(包括 该停语句)之间的 语句序列组成的。
29
(1) read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt