Note6- 代码优化

流图

基本块

先定义基本块的概念,基本块是满足下列条件的最大的连续三地址指令序列:

说白了基本块就是一堆原子指令,要么全都执行,要么全都不执行

如何划分指令序列中的基本块呢?划分基本块即确定哪些指令是首指令:

什么是流图

流图的结点就是一些基本块,它们按照可能的执行顺序连接起来。举例:

优化方法概览

常用的优化方法包括:

基本块的优化

也叫局部优化。首先将一个基本块转换为一个 DAG,例如:

赋值指令的表示

举例:

按照往常逻辑,a[i] 是公共子表达式。但是,这里的 j 是可以等于 i 的,那么 a[i] 就不是公共子表达式。所以我们要解决的问题就是如何防止系统产生这样的误判。

构造如下 DAG:

从 DAG 到基本块的的重组

举例:给定一个基本块,构造出 DAG

数据流分析

数据流分析是一组用于获取程序执行路径上的数据流信息的技术

数据流的分析模式

到达定值分析

变量 x 的定值是将一个值赋给 x 的语句

如果同一条路径上有多个对变量 x 的定制,则将前面的定值注销。举例

这个分析可以解决:

到达定值的数据流方程

传递函数

举例:

定义 IN[B] 为到达流图中基本块 B 的入口处的定值的集合,OUT[B] 为到达流图中基本块 B 的出口处的定值的集合

数据流方程

迭代算法:

用位向量表示各个基本块的集合,举例:

引用 - 定值链

是一个列表,对变量的每一次引用,到达该引用的所有定制都在该列表中

活跃变量分析

在 p 点,如果会引用变量 x 在 p 点的值,则称变量 x 在 p 点是活跃的

举例,注意活跃变量是逆向确定的

作用:

传递函数

逆向流方程

举例:

定值 - 引用链

可用表达式分析

在流图的点 p 上,如果 x op y 已经在之前被计算过,则不需要重新计算

可用表达式

如果基本块 B 对 x 或 y 进行了定值,且以后没有重新计算 x op y,则称 B 杀死了表达式 x op y。如果基本块 B 对 x op y 进行计算,并且之后没有重新定值 x 或 y,则称 B 生成表达式 x op y

传递函数

image-20230508222418777

数据流方程

流图中的循环

支配结点

自然循环

自然循环是一种适合于优化的循环

如何识别呢?

全局优化

删除全局公共子表达式

算法:

删除复制语句

循环不变计算检测

作用于归纳变量的强度削弱

检测算法:

归纳变量的删除

对于在强度削弱算法中引入的复制语句 j=t,如果在归纳变量 j 的所有引用点都可以用对 t 的引用代替对 j 的引用,并且 j 在循环的出口处不活跃,则可以删除复制语句 j=t