编译原理 第8章 优化处理
优化处理是指产生更高效的目标代码所做的工作
优化的分类
与机器无关的优化 :
- 全局优化 ---- 针对整个源程序
- 局部优化 ---- 除全局优化外皆属于次类
与机器有关的优化 : - 寄存器分配的优化
- 消除无用代码
常见的几种局部优化方法
-
常值表达式节省(常数合并)
如 \(a = 5 + 3 , b = a + 1\)中 , \(5+3\) 和 \(a + 1\)都为常值表达式 -
公共子表达式节省(删除多余运算)
如 \(a = b \times d + 1 , e = b \times d - 2\) 中 , \(b \ times d\) 就算公共表达式
- 删除无用赋值
如 \(x = 1 , x = 2\)中 , \(x = 1\) 为无用赋值
循环优化部分:
-
不变表达式外提
即循环中出现固定的 , 与循环量无关的表达式 , 可以在表达式外就算好 -
消减运算强度
如乘法变加法 , 乘方变乘法
局部优化算法探讨
局部优化算法以基本块为单位进行 , 基本块也是目标代码生成的基本单位
基本块划分算法
- 找出基本块的入口语句
- 程序的第一个语句或转向语句转移到的语句
- 紧跟在转移语句后的语句
- 对每一个入口语句 , 构造其所属的基本块
- 从该入口到另一入口(不包括)的语句序列
- 从该入口到另一转移语句(包括)或停止语句(包括)的语句序列
基于DAG的局部优化方法
四元式序列的DAG表示
节点为标号
节点左侧为运算符
节点右侧第一个为主标记
主标记右侧为附加标记
算法流程
- 构造基本块内优化的DAG
开始:
- DAG置空
- 依次选取四元式
- 定义\(B\) , \(C\) , 如果定义过 , 免
若 \(A = B\) - 节点右侧\(AB\)排
- 找之前的 , 如果已经出现过且不为主标记 , 抹去
若 \(A = C_1 w C_2\)
- 计算常值
- 若已经定义过 , 附加标记加\(A\)
- 若无 , 申请新节点
- 若已经有且不为主标记 , 抹去
若 \(A = B w C\)
- 若在存在 \(B w C\)节点 , 添加\(A\)
- 若不存在 , 申请新节点
- 若已有 , 则删除
完成后重构四元组

浙公网安备 33010602011771号