代码优化
代码优化的任务
通过等价的程序变换,获得执行速度快、占用空间少的程序
算法优化
例:顺序查找与hash算法
有效的数据结构和算法
领域相关
编译优化
目标代码优化:机器相关
特殊指令的利用
特殊结构的高效利用:SIMD、MIDM、流水、向量机
中间代码优化:机器无关
如:常数计算、公共代码段的提取
中间代码优化
局部优化
基本块内部(不包括各种转移控制)
全局优化
循环优化、控制流分析与化简、数据流分析
基本块和流图
基本块的划分
- 定义入口语句
代码序列的第一语句
转移语句的目标语句
转移语句的下一条语句
- 定义基本块
入口语句到下一入口语句之前
入口语句到转移语句或停语句
程序流图的构造
程序流图 G={N,E,n0 }
以基本块为结点,以控制流为有向边
N:基本块集
n0 :含首语句的基本块
E:有向边集合 (A, B)
A 的出口是转移语句,转向 B 的入口
A 的出口不是转移语句,B 紧跟 A 之后
局部优化
(1) 合并已知量
常数表达式计算
(2) 重新命名临时变量
(3) 删除基本块内的公共子表达式
(4) 删除死代码
未出现在程序流图中的代码
赋值但未引用的指令
(5) 交换语句次序
减少临时变量
循环优化
1.代码外提
将循环不变运算移到循环外
2.强度削弱
用较快的操作代替较慢的操作
循环归纳变量相关的强度削弱
归纳变量
3.消除归纳变量
利用归纳变量相关的计算代替归纳变量的计算
补充:
复写传播:
a=d+e;
b=d+e;
c=d+e;
===>
t=d+e;
a=t;
b=t;
c=t;
复写语句:形式为f = g 的赋值
优化过程中会大量引入复写
复写传播变换的做法是在复写语句f = g后,尽可能用g代表f
复写传播变换本身并不是优化,但它给其他优化带来机会