优化
- 定义:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码
- 等价:不能改变程序的运行结果
- 有效:目标代码运行时间段,占用存储空间小
- 优化的级别:局部优化,循环优化,全局优化
- 优化的种类
- 删除多余运算(删除公用子表达式)
- 合并已知量
- 复写传播
- 删除无用赋值
- 代码外提
- 强度消弱
- 变换循环控制条件
- 优化序列:
- 源代码
- 复写传播后:
- 已经计算过的直接引用
- 值始终相等的进行替换
- 删除无用赋值:
因为上一步进行了替换所有有一些赋值语句不再使用
- 强度削弱:
- 乘法变加法
- 用执行时间少的指令代替执行时间长的指令
- 删除归纳变量
- 把循环中用到的i和j删减了
- 修改控制中的条件
- 源代码
局部优化
-
基本块:程序中一顺序执行语句序列,其中只有一个入口和一个出口。入口就是其中第一个语句,出口就是其中最后一个语句。
-
划分基本块:局限于基本快范围内的优化称为基本块内的优化,或称局部优化
-
划分基本块的算法:
-
找出中间语句(三地址语句)程序中各个基本块的入口语句:
- 程序第一个语句
- 能由条件转移语句或无条件转移语句转移到的语句
- 紧跟在条件转移语句后面的语句
-
对以上求出的每个入口语句,确定其所属的基本块。它是由该入口语句到下一入口语句(不包括该入口语句)、或到一转移语句(包括该转移语句)之间的语句序列组成的、或一停语句(包括该停语句)之间的语句序列组成的。
-
凡未被纳入某一基本快中的语句,可以从程序中删除
-
示例:
-
-
流图:
- 以基本块为结点构成流图
- 如果一个结点的基本块的入口语句是程序的第一条语句,则称此结点为首结点
- 如果在某个执行顺序中,基本快B2紧接在基本块B1之后执行,则从B1到B2有一条有向边(B1是B2的前驱,B2是B1的后继)
- 有一个条件或无条件转移语句从B1的最后一条语句转移到B2的第一条语句。
- 在程序的序列中,B2紧接在B1的后面,并且B1的最后一条语句不是一个无条件转移语句。
-
基本块的DAG表示:
- 在DAG增加标记和附加信息:
- 图的叶结点以一标识符或常数作为标记,表示该结点代表该变量或常熟的值
- 图的内部结点以一运算符作为标记,表示该结点代表应用该运算符对其后继结点所代表的值进行计算的结果
- 各个结点上可能附加一个或多个标识符(称附加标识符)表示这些变量具有该结点所代表的值
- 四元式的DAG表示:
- 在DAG增加标记和附加信息:
-
基本块的优化算法:
- 一个基本块,可用一个DAG来表示
- 对基本块中每一条四元式代码,依次构造对应的DAG图,最后基本快中所有四元式构造出来DAG连成整个基本快的DAG
- 准备操作数的结点:构造结点
- 合并已知量:根据常数值能计算的将其计算出来
- 删除公共子表达式:计算过的值直接用之前的变量赋值
- 删除无用赋值:原来对一个值有了结果,现在又要其有新的结果,将之前的删除
-
示例:
- 算出常量之前那个常量结点可以删除(常数)删除无用赋值
- 最后结果来看第五句结果是多余的
- 优化四元式
- 算出常量之前那个常量结点可以删除(常数)删除无用赋值
循环优化
-
循环优化的措施
- 代码外提
- 强度消弱
- 删除归纳变量(变换循环控制条件)
- 循环展开
- 循环合并
-
代码外提:
-
所谓变量A在某点d的定值到达另一点u(或称变量A的定值点d到达另一点u),是指流图中从d有一通路到达u且该通路上没有A的其他定值
-
循环不变运算:对四元式A:=B op C,若B和C是常数,或者到达他们的B和C的定值点都在循环外
查找循环中华不变运算的算法
-
把循环不变运算提到循环体外
- 外提的位置:
示例:
- 外提的条件:
- 不变运算A所在的结点是L所有出口结点的必经结点
- A在循环中其他地方未再定值,才能把循环不变运算A:=B op C外提
- 循环中所有A的引用点只有S中的A的定值才能到达
- 代码外提算法:
- 外提的位置:
-
强度消弱:把程序中执行时间较长的运算转换为执行时间较短的运算
- 强度消弱通常是针对循环控制变量有线性关系的变量赋值进行
- 经过强度消弱后,循环中可能出现一些新的无用赋值
- 对于消弱下标变量地址计算的强度非常有效
-
删除归纳变量:
计算T3终止值将I替换
- 删除归纳变量再强度消弱以后进行
- 强度消弱和删除归纳变量的统一算法框架
-
例题
- 优化的目的:
为了便于在目标代码生成阶段从优化的中间代码出发,生成更加有效的目标代码 - 优化遵循的原则:
- 等价原则:变换前后的代码在逻辑上必须是等价的,变换不能改变程序的运行结果
- 有效原则
- 合算原则
- 从优化的范围来看,优化分为:
- 局部优化
- 循环优化
- 全局优化