编译原理 第8章 优化处理

优化处理是指产生更高效的目标代码所做的工作

优化的分类

与机器无关的优化 :

  1. 全局优化 ---- 针对整个源程序
  2. 局部优化 ---- 除全局优化外皆属于次类
    与机器有关的优化 :
  3. 寄存器分配的优化
  4. 消除无用代码

常见的几种局部优化方法

  1. 常值表达式节省(常数合并)
    \(a = 5 + 3 , b = a + 1\)中 , \(5+3\)\(a + 1\)都为常值表达式

  2. 公共子表达式节省(删除多余运算)

\(a = b \times d + 1 , e = b \times d - 2\) 中 , \(b \ times d\) 就算公共表达式

  1. 删除无用赋值

\(x = 1 , x = 2\)中 , \(x = 1\) 为无用赋值

循环优化部分:

  1. 不变表达式外提
    即循环中出现固定的 , 与循环量无关的表达式 , 可以在表达式外就算好

  2. 消减运算强度
    如乘法变加法 , 乘方变乘法

局部优化算法探讨

局部优化算法以基本块为单位进行 , 基本块也是目标代码生成的基本单位

基本块划分算法

  1. 找出基本块的入口语句
  • 程序的第一个语句或转向语句转移到的语句
  • 紧跟在转移语句后的语句
  1. 对每一个入口语句 , 构造其所属的基本块
  • 从该入口到另一入口(不包括)的语句序列
  • 从该入口到另一转移语句(包括)或停止语句(包括)的语句序列

基于DAG的局部优化方法

四元式序列的DAG表示

节点为标号

节点左侧为运算符

节点右侧第一个为主标记

主标记右侧为附加标记

算法流程

  1. 构造基本块内优化的DAG
    开始:
  • DAG置空
  • 依次选取四元式
  • 定义\(B\) , \(C\) , 如果定义过 , 免
    \(A = B\)
  • 节点右侧\(AB\)
  • 找之前的 , 如果已经出现过且不为主标记 , 抹去

\(A = C_1 w C_2\)

  • 计算常值
  • 若已经定义过 , 附加标记加\(A\)
  • 若无 , 申请新节点
  • 若已经有且不为主标记 , 抹去

\(A = B w C\)

  • 若在存在 \(B w C\)节点 , 添加\(A\)
  • 若不存在 , 申请新节点
  • 若已有 , 则删除

完成后重构四元组

posted @ 2025-04-15 13:28  Guaninf  阅读(27)  评论(0)    收藏  举报