
第10章(1)代码优化 简介 基本块 ■代码优化技术 局部优化(重点) ■3 循环优化(难点) 作业 实验 2025/4/2 课程目录②5
2025/4/2 第10章(1)代码优化 ◼ 简介 ◼ 基本块 ◼ 代码优化技术 ◼ 局部优化(重点) ◼ 循环优化(难点) ◼ 作业 ◼ 实验 课程目录 1/15

什么是代码优化 p255 ■含义 ◆等价变换,生成更有效的目标代码 ■编译的优化工作阶段 源代码前端中间代码.代码产生 .目标代码 中间代码优化 目标代码优化 :Y ◆优化可在编译的各个阶段进行 2025/4/2 ☒D 2/15
2025/4/2 什么是代码优化 p255 ◼ 含义 ◆等价变换,生成更有效的目标代码 ◼ 编译的优化工作阶段 ◆优化可在编译的各个阶段进行 前端 中间代码 代码产生 中间代码优化 目标代码优化 源代码 目标代码 2/15

优化的目的和原则 ■优化目的 ◆产生更高效的目标代码一一时间空间 ◆合理利用计算机资源一一指令寄存器 ■优化原则 ◆等价 不改变程序的运行结果 ◆高效一运行时间较短,占用存储空间较小 ◆合算 以较低的代价取得较好的优化效果 ◆例如:优化算法生成目标代码运行时间缩短, 占用空间减少,但若优化算法本身运行是浪费 了过多的时间和空间,则不一定合算 2025/4/2 3/15
2025/4/2 优化的目的和原则 ◼ 优化目的 ◼ 优化原则 ◆产生更高效的目标代码——时间 空间 ◆合理利用计算机资源——指令 寄存器 ◆等价——不改变程序的运行结果 ◆高效——运行时间较短,占用存储空间较小 ◆合算——以较低的代价取得较好的优化效果 ◆例如:优化算法生成目标代码运行时间缩短, 占用空间减少,但若优化算法本身运行是浪费 了过多的时间和空间,则不一定合算 3/15

优化的分类 ■按阶段分成 ◆与机器无关的优化,对中间代码进行 ◆依赖于机器的优化,生成目标代码时进行 ■根据优化时所涉及的程序范围分成 ◆局部优化在基本块内部进行优化 ◆循环优化对循环中的代码进行优化 ◆全局优化大范围的优化,涉及整个程序 2025/4/2 章节目绿)415
2025/4/2 优化的分类 ◼ 按阶段分成 ◼ 根据优化时所涉及的程序范围分成 ◆与机器无关的优化,对中间代码进行 ◆依赖于机器的优化,生成目标代码时进行 ◆局部优化 在基本块内部进行优化 ◆循环优化 对循环中的代码进行优化 ◆全局优化 大范围的优化,涉及整个程序 章节目录 4/15

例如下基本块 基本块的定义和性质p255 (1)T1:=A8 入▣ (2)T2:=3/2 语句 ■基本块的定义 (3)T3:=T1-T2 (4)X:=T3 ◆是指程序中一顺序执行的 语句序列,其中只有一个 (5)C:=2 入口语句和一个出口语句 (6)T4:=AB ■基本块的性质 (7)T5:=18+C 出口 (8)T6:=T4*T5 语句 (9)Y:=T6 基本块内的语句要么全执行, 要么全不执行,而不能只执行一部分 2025/4/2 D515
2025/4/2 基本块的定义和性质 p255 ◼ 基本块的定义 ◆是指程序中一顺序执行的 语句序列,其中只有一个 入口语句和一个出口语句 例如下基本块 (1)T1:=A*B (2)T2:=3/2 (3)T3:=T1-T2 (4)X:=T3 (5)C:=2 (6)T4:=A*B (7)T5:=18+C (8)T6:=T4*T5 (9)Y:=T6 入口 语句 出口 语句 ◼ 基本块的性质 基本块内的语句要么全执行, 要么全不执行,而不能只执行一部分 5/15

■合并常数和已知量 常用局部优化技术p270 (2)编译时计算(2) (1)T1:=A*8 (1)T1:=A*8 (7)编译时计算(7) ■删除多余运算 (2)T2.=3/2 2T2.-1.5 (1)(6)A*B公共子表达式 3T3.-T1T2(33:=T1-1.5 只需计算一次(6) ■复写传播 (4)X:3 (2)X:=T1-1.5 (3)引用T2(3) 5)C.=2 (8)引用T4,T5(8) (6)T4.=*8 (6)T4:-T1 ■删除无用赋值 设所有临时变量T和C在以后无 (7分T5.=18+e 7T5.=20 用,则除了计算X,Y时要用到(8)T6:-T4*T5 (8①6:=T1*20 的变量保留外,删除其它赋值 (9)Y:6 (3)Y:=T1*20 (2)(5)(6)(7) 优化后只有5条代码 进一步优化后只有3条代码,如何实现? 2025/4/2 0D6/15
2025/4/2 常用局部优化技术 p270 ◼ 删除无用赋值 设所有临时变量T和C在以后无 用,则除了计算X,Y时要用到 的变量保留外,删除其它赋值 (2)’(5)’(6)’(7)’ (1)T1:=A*B (2)T2:=3/2 (3)T3:=T1-T2 (4)X:=T3 (5)C:=2 (6)T4:=A*B (7)T5:=18+C (8)T6:=T4*T5 (9)Y:=T6 优化后只有5条代码 ◼合并常数和已知量 (2) 编译时计算(2’) (7) 编译时计算(7’) (2’)T2:=1.5 (7’)T5:=20 ◼复写传播 (3)引用T2 (3’) (8)引用T4,T5 (8’) ◼删除多余运算 (1)(6) A*B公共子表达式 只需计算一次 (6’) (6’)T4:=T1 (3’)T3:=T1-1.5 (8’)T6:=T1*20 进一步优化后只有3条代码,如何实现? (1)T1:=A*B (2)X:=T1-1.5 (3)Y:=T1*20 6/15

基本块的DAG表示及其应用 p27110.3.2 ■基本块的DAG构造算法部分优化 ■基本块的DAG应用 进一步优化 2025/4/2 715
2025/4/2 基本块的DAG表示及其应用 p271 10.3.2 ◼ 基本块的DAG构造算法 部分优化 ◼ 基本块的DAG应用 进一步优化 7/15

基本块的DAG表示举例 ■有向无环图 DAG表示 DAG结点建立顺序 三地址代码 重建代码 过程 及结点对应表 (1)c:=a+b (1)c:=a+b 删除 (2)a:=cd (2)a:=c-d 编号 指 多余 指 附加 (3)b:=a+b (3)d:=a 运算 标记 (4)d:=c-d (4)b:=a+b n5a, 264 o + 1 2c 附加标记(右边) n3/ n4 do do √5 一 3 4 a,d 6 5 2 b 标记(下边) ao 2025/4/2 8/15
2025/4/2 基本块的DAG表示举例 ◼ 有向无环图 三地址代码 (1)c:=a+b (2)a:=c-d (3)b:=a+b (4)d:=c-d 编 号 结点 标记 左 指 针 右 指 针 附加 标记 n1 a0 1 a0 b0 2 b0 n3 + 标记(下边) 附加标记(右边) c 3 + 1 2 c DAG结点建立顺序 及结点对应表 n4 d0 4 d0 n5 - a 5 - 3 4 a n6 + b 6 + 5 2 b ,d ,d DAG表示 过程 删除 多余 运算 重建代码 √ √ √ (1)c:=a+b √ √ (2)a:=c-d (3)d:=a √ (4)b:=a+b n2 8/15

基本块的DAG表示 ■基本块的DAG ◆结点带有标记或附加标记的DAG nk b ni附加标记 ni ni o ▣叶结点 标记 80℃ 口标记是一个标识符(变量名)或常数 ni 口代表该变量或常数的值举例 变量a的初昼0 口内部结点 ▣附加标记 表b:=3+a 块外定但, 标记是一个运算符 ▣一个或多公复变量的当 代表其直接后继结点值 可以附加到点 进行该运算的结果举例 口表示这些变量持有该 结点所代表的值举例 2025/4/2 9/15
2025/4/2 基本块的DAG表示 ◼ 基本块的DAG ◆结点带有标记或附加标记的DAG ni 标记 附加标记 叶结点 标记是一个标识符(变量名)或常数 代表该变量或常数的值 举例 ni 3 nj a0 变量a的初值 表示该值由 块外定值, 以免与a的当 前值混淆 内部结点 标记是一个运算符 代表其直接后继结点值 进行该运算的结果 举例 ni nj nk op 附加标记 一个或多个变量 可以附加到各个结点 表示这些变量持有该 结点所代表的值举例 b:=3+a 3 a0 + b 9/15

基本块的DAG构造举例p273~274 原代码 对应表 DAG构造过程 一(1)T0:=3.14编 附加 记 左佑 标记 删除 一(2)T1:=2*T0 1 3.14 To 其它B 一(3)T2:=R+r 26.28 T1,T3 一(4)A:=T1*T2 3 Ro 4 ro n6 n 一(5)B:=A 5 3 4 I2, 米 一(6)T3:=2*T0 6 2 5 A, 3 4 T6 15 一(7)T4:=R+r 8 米 6 B 一(8)T5:-①3*T4 T1,3 n 一(9)T6:=R-rA=6.28*①2 n2 n3 (10)B:=T5*T6 3.14 6.28 Ro 合并已知量 删除无用赋值 删除多余运算 复写传播 2025/4/2 10/15
2025/4/2 基本块的DAG构造举例 p273~274 原代码 (1)T0:=3.14 (2)T1:=2*T0 (3)T2:=R+r (4)A:=T1*T2 (5)B:=A (6)T3:=2*T0 (7)T4:=R+r (8)T5:=T3*T4 (9)T6:=R-r (10)B:=T5*T6 对应表 编 号 标 记 左 右 附加 标记 DAG构造过程 n1 3.14 T0 1 3.14 T0 n2 2 n2 6.28 T1 2 6.28 T1 n3 R0 3 R0 n4 r0 4 r0 n5 + T2 5 + 3 4 T2 n6 * A 6 * 2 5 A ,B ,B n7 2 ,T3 ,T3 ,T4 ,T4 ,T5 ,T5 n7 - T6 7 - 3 4 T6 n8 * B 删除 其它B 8 * 6 7 B 合并已知量 删除多余运算 删除无用赋值 复写传播 A=6.28*T2 10/15