- 3
- 0
- 约5.27千字
- 约 24页
- 2018-11-05 发布于广西
- 举报
第11章 优化 1:所谓优化 一般是指为提高目标程序的质量而进行的各项工作。 即对程序或中间代码进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。 这里所说的质量,通常是指目标程序所占的存储空间(即程序的静态长度)的大小和运行目标程序所需要的时间(即程序的动态长度)的多少。 优化之目的在于,既要设法缩小存储空间,又要尽量提高运行速度,而且常常偏重于提高运行速度。 第11章 优化 2:优化涉及面很广 从优化与机器的关系出发,可将优化分为与机器无关的优化和与机器相关的优化。 与机器无关的优化可在源程序或中间语言程序一级上进行。 这类优化主要包括: ①常数合并, ②公共表达式的消除, ③循环中不变式的外提, ④运算强度的削弱,等等。 第11章 优化 3:从优化与源程序的关系而言 可把优化分为局部优化和全局优化。 局部优化通常是在只有一个入口(程序段的第一条代码)和一个出口(程序段的最后一条代码)的基本块上的优化。 因为只存在一个入口和一个出口,又是线性的; 即逐条顺序执行的,不存在转入转出、分叉汇合等问题; 处理起来就比较简单,开销也较少,但优化效果稍差。 全局优化指的是在非线性程序块上的优化。 程序块是非线性的; 因此需要分析比基本块更大的程序块乃至整个源程序的控制流程,需要考虑较多的因素。 这样的优化比较复杂,开销也较大,但效果较好。 11.1 基本块及其求法 1:基本块 基本块: 一个入口(第一语句) 一个出口(最后一语句) 入口语句集: 程序的第一个语句号; goto语句的下一条语句号; goto语句转到的语句号。 基本块划分: 入口语句集排序后每一入口语句到下一入口语句号的前一语句。 最后一基本块为最后入口语句号到最后语句。 11.1 基本块及其求法 2:把四元式还原成较直观的形式 为便于讨论把四元式还原成较直观的形式,我们约定: (op B C A)→A:=B op C; (jumpθ B C L)→if (BθC) goto L; (jump — — L)→goto L; 11.1 基本块及其求法 3:例如,考虑下述四元式序列: ① read a ② read b ③ r:=a mod b ④ if r=0 goto (8) ⑤ a:=b ⑥ b:=r ⑦ goto(3) ⑧ write(b) ⑨ halt ①、③、⑤、⑧是人口语句; ①~②、③~④、⑤~⑦、⑧~⑨分别构成基本块。 如图11.1所示。 11.2 优化举例 1:中间代码 例如,考虑源程序段 Begin integer i,j; array A,B[0..99,0..99]; … for i:=0 step 1 until 99 do A[i,2*j]:=B[i,2*j]+5*3.1416; end 其中间语言程序为: ① i:=0; ② T1:=2*j; ③ T2:=100*i+T1; ④ T3:=5*3.1416; ⑤ R1:=B[T2]; ⑥ T4:=2*j; ⑦ T5:=100*i+T4; ⑧ A[T5]:=R1+T3; ⑨ i:=i+1; ⑩ if i100 then goto ② 11.2 优化举例 2:中间代码基本块 中间语言程序为: ① i:=1; ② T1:=2*j; ③ T2:=100i+T1; ④ T3:=5*3.1416; ⑤ R1:=B[T2]; ⑥ T4:=2*j; ⑦ T5:=100*i+T4; ⑧ A[T5]:=R1+T3; ⑨ i:=i+1; ⑩ if i≤100 then goto ② 11.2 优化举例 3:常量合并 ④中的运算是常量运算,可以在编译阶段完成,归并成常量T3:=15.708。 这样做的好处是明显的,就本例可看出,因为它在循环语句中,所以5*3.1416需要重复计算100次。 如在编译时归并好,则只要算一次。这就是所谓的常量合并。 11.2 优化举例 4:公共子表达式的消除 ②和⑥都要计算2*j,而且在②和⑥之间j之值并未发生变化,因此无须计算两次,可以取消对⑥的计算。 ③和⑦都要计算100*i+t1,(注意:t4实质上就有t1),而且在③和⑦之间,i和t1之值都未发生变化,因此,也只要计算一次就够了,可以取消⑦的计算。 这些优化是在基本块上进行的,所以是局部优化。经优化后,得到图11.3所示的中间程序。 11.2 优化举例 5:运算强度的削弱 i之值的变化是有规律的 Tl之值在循环中保持不变 ③中的100*i+Tl是线性表达式 i分别取值1,2,…,100时 该值100+T1,200+T1,…, 10000+T1
原创力文档

文档评论(0)