8.1 引言
8.2 基本块
8.3 基本块的优化
8.4 与循环有关的优化
第八章 代码优化
8.1 引言
一,优化的概念
二、代码优化的分类
第八章 代码优化
8.1 引言
一,优化的概念
代码优化指的是编译时刻为改进目标程序的质量而进行
的各项工作。改进质量以提高两方面的效率,即时间效率与
空间效率。
第八章 代码优化
8.1 引言
一,优化的概念
二、代码优化的分类
1.与机器相关性
2.优化范围
3.优化语言级
第八章 代码优化
8.1 引言
一,优化的概念
二、代码优化的分类
1.与机器相关性
2.优化范围
3.优化语言级
第八章 代码优化
与机器相关的优化一般有寄存器的优
化, 多处理器的优化, 特殊指令的优化
及无用指令的消除等四类 。
与机器无关的优化, 包括基本块的优
化和循环的优化 。
8.1 引言
一,优化的概念
二、代码优化的分类
1.与机器相关性
2.优化范围
3.优化语言级
第八章 代码优化
可以把优化分成 局部优化 和 全局优化 两类 。
考察一个基本块中的四元式序列就可完成的
优化, 称为局部优化, 否则, 称为全局优化 。
对基本块的优化可以是:合并常量计算, 消
除公共子表达式, 削减计算强度与删除无用代码
等 。
对循环的优化有三种, 即循环不变表达式外
提, 归纳变量删除与计算强度削减 。
8.1 引言
一,优化的概念
二、代码优化的分类
1.与机器相关性
2.优化范围
3.优化语言级
第八章 代码优化
在通常的编译程序实现中, 代码优化往
往是在内部中间表示一级上进行的, 例如对
源程序的四元式序列或三元式序列进行代码
优化 。
8.1 引言
8.2 基本块
基本块是这样一个连续的四元式序列,即控制流从其
第一个四元式进入,而从其最后一个四元式离开,其间没
有停止也不可能有分支。
第八章 代码优化
8.1 引言
8.2 基本块
8.3 基本块的优化
一、合并常量计算
二、消除公共子表达式
三、削减计算强度
四、删除无用代码
第八章 代码优化
8.1 引言
8.2 基本块
8.3 基本块的优化
一、合并常量计算
二、消除公共子表达式
三、削减计算强度
四、删除无用代码
第八章 代码优化
l=2*pi*r;
(1) * 2 3.1416 t1
(2) * t1 r t2
(3),= t2 l
优化后,
(1) * 6.2832 r t2
(2),= t2 l
8.1 引言
8.2 基本块
8.3 基本块的优化
一、合并常量计算
二、消除公共子表达式
三、削减计算强度
四、删除无用代码
第八章 代码优化 x+y*t- a*(x+y*t)/(y*t);
(1) * y t t1
(2) + x t1 t2
(3) * y t t3
(4) + x t3 t4
(5) * a t4 t5
(6) * y t t6
(7) / t5 t6 t7
(8) - t2 t7 t8
优化后,
(1) * y t t1
(2) + x t1 t2
(3) * a t2 t5
(4) / t5 t1 t7
(5) - t2 t7 t8
8.1 引言
8.2 基本块
8.3 基本块的优化
一、合并常量计算
二、消除公共子表达式
三、削减计算强度
四、删除无用代码
第八章 代码优化
·用 x*x代替 x**2;
·用 x+x代替 2*x或 2.0*x;
·用 x*0.5代替 x/2;
_________
- b + √ b2- 4ac
x1=------------------
2a
x1=(- b+sqrt(b**2- 4*a*c))/(2*a);
优化后,
x1=( - b+sqrt(b*b - 4*a*c))/(a+a);
8.1 引言
8.2 基本块
8.3 基本块的优化
一、合并常量计算
二、消除公共子表达式
三、削减计算强度
四、删除无用代码
第八章 代码优化
四元式 op x y z把 x与 y进行 op运
算的结果值保存在 z中, 以备此后的
引用, 但如果此后不再引用 z,上述
四元式的存在是多余的 。 因此, 称
计算的值决不被引用的四元式为无
用代码 。
8.1 引言
8.2 基本块
8.3 基本块的优化
8.4 与循环有关的优化
一、循环不变表达式外提
二、归纳变量删除
三、计算强度削减
第八章 代码优化
8.1 引言
8.2 基本块
8.3 基本块的优化
8.4 与循环有关的优化
一、循环不变表达式外提
二、归纳变量删除
三、计算强度削减
第八章 代码优化
例 8.7 假设需计算半径为 r的圆上不
同圆心角之扇形的面积, 让初始大小
为 10°, 以后每次增加 10°, 直到全
圆为止 。
for(n=1; n<=36; n=n+1)
{S=10.0/360.0*pi*r*r*n;
printf(“Angle is %d,Area is %f”,n*10,S);
}
优化后,
C=10.0/360.0*pi*r*r;
for(n=1; n<=36; n=n+1)
{S=C*n;
printf(“Angle is %d,Area is %f”,n*10,S);
}
8.1 引言
8.2 基本块
8.3 基本块的优化
8.4 与循环有关的优化
一、循环不变表达式外提
二、归纳变量删除
三、计算强度削减
第八章 代码优化
定义 8.2 在循环中如果变量 i
的值随着循环的每次重复都是增加
或减少某个固定的常量值, 则称 i
为循环的归纳变量 。
如果在一个循环中有两个或更
多个的归纳变量, 归纳变量个数往
往可以减少, 甚至减少到 1个 。
减少归纳变量的个数这类优化
称为归纳变量删除 。