第8章代码优化
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在图8–2的B5中分别把 公共子表达式4*i和4*j的值 赋给T7和T10,因此这种重 复计算可以消除,即B5中的 代码变换成:
T6:=4*i x:=a[T6] T7:=4*i T8:=4*j T9:=a[T8] a[T7]:=T9 T10:=4*j a[T10]:=x goto B2
T6:=4*i x:=a[T6] T7:=T6 T8:=4*j T9:=a[T8] a[T7]:=T9 T10:=T8 a[T10]:=x goto B2
教学内容
8.1 优化概述 8.2 局部优化 8.3 循环优化 8.4 本章小结
8.1 优化概述
(1)优化的含义
对程序进行各种等价变换,使得从变换后的程序出发,能生成更有 效的目标代码,称这种变换为优化。
(2)优化分类
①根据编译阶段的不同划分 与机器无关的中间代码优化 依赖于机器的目标代码优化 ②根据优化对象所涉及的程序范围划分 局部优化 循环优化 全局优化
T11 : 4 *i x : a[T11] T12 : 4 *i T13 : 4 * n T14 : a[T13 ] a[T12 ] : T14 T15 : 4 * n a[T15 ] : x
8.1 优化概述
①删除公共子表达式
如果一个表达式E在前 面已计算过,并且在这之后 E中变量的值没有改变,则 称E为公共子表达式。
8.1 优化概述
②复写传播
图8–3中的B5还可以进
一步改进,四元式T6:=T2把 T6:=T2
T2赋给了T6,而四元式
x:=a[T6]
x:=a[T6]中引用了T6的值, 但这中间并没有改变T6的值。 因此,可以把x:=a[T6]变换
T7:=T6 T8:=T4 T9:=a[T8] a[T7]:=T9
8.1 优化概述
(3)代码优化器的地位
有很多技术和手段可以用于中间代码这一级上的优化。总体上讲在 一个编译程序中优化器的地位和结构如下图:
编译前端
代码优化器
代码产生
控制流分析
数据流分析
Βιβλιοθήκη Baidu
代码变换
8.1 优化概述
(4)代码优化遵循的原则
优化的目的是为了产生更高效的代码。由优化编译程序提供的,对 代码的各种变换必须遵循以下三个原则: ① 等价原则 经过优化后不应改变程序运行的结果。 ② 有效原则 使优化后所产生的目标代码运行时间较短,占用的存储空间较 小。 ③ 合算原则 应尽可能以较低的代价取得较好的优化效果。
B4 if i jgotoB6
B5
T6 : T2 x : a[T6 ] T7 : T6 T8 : T4 T9 : a[T8 ] a[T7 ] : T9 T10 : T8 a[T10 ] : x gotoB2
B6
T11 : T2 x : a[T11] T12 : T11 T13 : T1 T14 : a[T13 ] a[T12 ] : T14 T15 : T1 a[T15 ] : x
B1
i : m 1 j: n T1 : 4* n v : a[T1]
B2 i : i 1 T2 : 4*i T3 : a[T2 ] if T3 vgotoB2
B3 j: j 1 T4 : 4* j T5 : a[T4 ] if T5 vgotoB3
B4 if i jgotoB6
B5
B6
T6 : 4*i x : a[T6 ] T7 : 4*i T8 : 4* j T9 : a[T8 ] a[T7 ] : T9 T10 : 4 * j a[T10 ] : x gotoB2
8.1 优化概述
对B5删除了公共子表达式后,仍然要计算 4*i和4*j ,我们还可以在更大范围内来考虑删除 公共子表达式的问题,即利用B3中的四元式 T4:=4*j可以把B5中的代码T8:=4*j替换为T8:=T4。
同样,利用B2中的赋值句T2:=4*i可以把B5 中的代码T6:=4*i替换为T6:=T2。
编译原理
第8章 代码优化
安庆师范学院计算机与信息学院
本章目标
❖ 解释优化的基本概念以及代码优化器的地位和结构 ❖ 说明编译程序进行代码变换应遵循的原则 ❖ 通过实例说明代码优化通常采用的基本方法 ❖ 介绍基本块的概念及其划分算法 ❖ 说明程序流图的构造方法 ❖ 介绍基本块的DAG表示方法 ❖ 介绍循环优化一般采用的方法
8.1 优化概述
(5)常用的代码优化的方法
①删除公共子表达式(删除多余运算) ②复写传播 ③删除无用代码(删除无用赋值) ④合并已知量 ⑤代码外提 循环优化 ⑥强度削弱 ⑦删除归纳变量
8.1 优化概述
(6)代码优化举例
我们通过一个高级语言程序的例子来了解代码优化的全过程。下面 是一个用C语言编写的快速排序子程序:
对于B6也可以同样考虑,最后,删除公共 子表达式后的程序流图如图8–3所示。
B1
i : m 1 j: n T1 : 4* n v : a[T1]
B2 i : i 1 T2 : 4*i T3 : a[T2 ] if T3 vgotoB2
B3 j: j 1 T4 : 4* j T5 : a[T4 ] if T5 vgotoB3
void quicksort (int m, int n){ int i,j; int v, x; if(n<=m) return; /*fragment begins here*/ i=m−1; j=n; v=a[n]; while(1){ do i=i+1; while(a[i]<v); do j=j−1; while(a[j]>v); if(i>=j) break;
为x:=a[T2]。这种变换称为 T10:=T8
复写传播。用复写传播的方 a[T10]:=x
法可以把B5变为:
x=a[i]; a[i]=a[j]; a[j]=x; } x=a[i]; a[i]=a[n]; a[n]=x; /*fragment ends here*/ quicksort(m, j); quicksort(i+1,n); }
8.1 优化概述
通过第6章的中间代码生成方法可以产生这 个程序的中间代码。图8–2给出了程序中两个注 解行之间的语句翻译成中间代码序列后所对应 的程序流图,对图8–2程序流图的代码优化叙述 如下。
T6:=4*i x:=a[T6] T7:=4*i T8:=4*j T9:=a[T8] a[T7]:=T9 T10:=4*j a[T10]:=x goto B2
T6:=4*i x:=a[T6] T7:=T6 T8:=4*j T9:=a[T8] a[T7]:=T9 T10:=T8 a[T10]:=x goto B2
教学内容
8.1 优化概述 8.2 局部优化 8.3 循环优化 8.4 本章小结
8.1 优化概述
(1)优化的含义
对程序进行各种等价变换,使得从变换后的程序出发,能生成更有 效的目标代码,称这种变换为优化。
(2)优化分类
①根据编译阶段的不同划分 与机器无关的中间代码优化 依赖于机器的目标代码优化 ②根据优化对象所涉及的程序范围划分 局部优化 循环优化 全局优化
T11 : 4 *i x : a[T11] T12 : 4 *i T13 : 4 * n T14 : a[T13 ] a[T12 ] : T14 T15 : 4 * n a[T15 ] : x
8.1 优化概述
①删除公共子表达式
如果一个表达式E在前 面已计算过,并且在这之后 E中变量的值没有改变,则 称E为公共子表达式。
8.1 优化概述
②复写传播
图8–3中的B5还可以进
一步改进,四元式T6:=T2把 T6:=T2
T2赋给了T6,而四元式
x:=a[T6]
x:=a[T6]中引用了T6的值, 但这中间并没有改变T6的值。 因此,可以把x:=a[T6]变换
T7:=T6 T8:=T4 T9:=a[T8] a[T7]:=T9
8.1 优化概述
(3)代码优化器的地位
有很多技术和手段可以用于中间代码这一级上的优化。总体上讲在 一个编译程序中优化器的地位和结构如下图:
编译前端
代码优化器
代码产生
控制流分析
数据流分析
Βιβλιοθήκη Baidu
代码变换
8.1 优化概述
(4)代码优化遵循的原则
优化的目的是为了产生更高效的代码。由优化编译程序提供的,对 代码的各种变换必须遵循以下三个原则: ① 等价原则 经过优化后不应改变程序运行的结果。 ② 有效原则 使优化后所产生的目标代码运行时间较短,占用的存储空间较 小。 ③ 合算原则 应尽可能以较低的代价取得较好的优化效果。
B4 if i jgotoB6
B5
T6 : T2 x : a[T6 ] T7 : T6 T8 : T4 T9 : a[T8 ] a[T7 ] : T9 T10 : T8 a[T10 ] : x gotoB2
B6
T11 : T2 x : a[T11] T12 : T11 T13 : T1 T14 : a[T13 ] a[T12 ] : T14 T15 : T1 a[T15 ] : x
B1
i : m 1 j: n T1 : 4* n v : a[T1]
B2 i : i 1 T2 : 4*i T3 : a[T2 ] if T3 vgotoB2
B3 j: j 1 T4 : 4* j T5 : a[T4 ] if T5 vgotoB3
B4 if i jgotoB6
B5
B6
T6 : 4*i x : a[T6 ] T7 : 4*i T8 : 4* j T9 : a[T8 ] a[T7 ] : T9 T10 : 4 * j a[T10 ] : x gotoB2
8.1 优化概述
对B5删除了公共子表达式后,仍然要计算 4*i和4*j ,我们还可以在更大范围内来考虑删除 公共子表达式的问题,即利用B3中的四元式 T4:=4*j可以把B5中的代码T8:=4*j替换为T8:=T4。
同样,利用B2中的赋值句T2:=4*i可以把B5 中的代码T6:=4*i替换为T6:=T2。
编译原理
第8章 代码优化
安庆师范学院计算机与信息学院
本章目标
❖ 解释优化的基本概念以及代码优化器的地位和结构 ❖ 说明编译程序进行代码变换应遵循的原则 ❖ 通过实例说明代码优化通常采用的基本方法 ❖ 介绍基本块的概念及其划分算法 ❖ 说明程序流图的构造方法 ❖ 介绍基本块的DAG表示方法 ❖ 介绍循环优化一般采用的方法
8.1 优化概述
(5)常用的代码优化的方法
①删除公共子表达式(删除多余运算) ②复写传播 ③删除无用代码(删除无用赋值) ④合并已知量 ⑤代码外提 循环优化 ⑥强度削弱 ⑦删除归纳变量
8.1 优化概述
(6)代码优化举例
我们通过一个高级语言程序的例子来了解代码优化的全过程。下面 是一个用C语言编写的快速排序子程序:
对于B6也可以同样考虑,最后,删除公共 子表达式后的程序流图如图8–3所示。
B1
i : m 1 j: n T1 : 4* n v : a[T1]
B2 i : i 1 T2 : 4*i T3 : a[T2 ] if T3 vgotoB2
B3 j: j 1 T4 : 4* j T5 : a[T4 ] if T5 vgotoB3
void quicksort (int m, int n){ int i,j; int v, x; if(n<=m) return; /*fragment begins here*/ i=m−1; j=n; v=a[n]; while(1){ do i=i+1; while(a[i]<v); do j=j−1; while(a[j]>v); if(i>=j) break;
为x:=a[T2]。这种变换称为 T10:=T8
复写传播。用复写传播的方 a[T10]:=x
法可以把B5变为:
x=a[i]; a[i]=a[j]; a[j]=x; } x=a[i]; a[i]=a[n]; a[n]=x; /*fragment ends here*/ quicksort(m, j); quicksort(i+1,n); }
8.1 优化概述
通过第6章的中间代码生成方法可以产生这 个程序的中间代码。图8–2给出了程序中两个注 解行之间的语句翻译成中间代码序列后所对应 的程序流图,对图8–2程序流图的代码优化叙述 如下。