编译原理第11章 代码优化.ppt

编译原理之 代码优化 华东交通大学软件学院 万仲保 第11章 代码优化 优化技术简介 局部优化 控制流分析和循环优化 数据流的分析与全局优化 优化技术简介 优化概念 优化分类 优化技术 优化概念 优化实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。 优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也有所不同,在同一范围内,可进行多种优化。 一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行。 优化分类 按阶段分类 与机器无关的优化 依赖于机器的优化 根据优化所涉及的程序范围分类 局部优化:是在只有一个入口、一个出口的基本程序块上进行的优化。 循环优化:是对循环中的代码进行的优化。 全局优化:是在整个程序范围内进行的优化。 优化技术 删除多余运算(删除公共子表达式) 代码外提 强度削弱 变换循环控制条件 合并已知量与复写传播 删除无用赋值 删除多余运算 目的:在于使目标代码执行速度较快。 示例: 程序代码 中间代码段 删除多余运算的程序代码 P:=0 for I:=1 to 20 do P:=P+A[I]*B[I] 删除多余运算优化的中间代码 (1)P:=0 (2)I:=1 代码外提 把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面。使之只在循环外计算一次。 示例 代码外提示例 强度削弱 强度削弱的思想是把强度大的运算换算成强度小的运算。 示例 强度削弱示例 变换循环控制条件 变换循环控制条件,确保整个程序的运行结果不变。 示例 变换循环控制条件示例 合并已知量与复写传播 运算对象都是编码时的已知量,可在编译时计算出它的值。 复写传播变换的做法是:在复写语句f:=g后尽可能用g代表f。 示例 合并已知量与复写传播示例 删除无用赋值 只要程序中其它地方不需要引用的赋值语句,删除后对程序的运行结果无任何作用。 示例 删除无用赋值示例 局部优化 基本块的概念 基本块的划分 基本块的变换 基本块的DAG表示 DAG构造算法 DAG的应用 基本块的概念 基本块,是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句。执行时只能从其入口语句进入,从其出口语句退出。 入口语句,严格地说来就是: 1.程序的第一个语句; 2.条件转移语句或无条件转移语句的转移目标语句; 3.紧跟在条件转移语句后面的语句。 基本块的划分 划分中间代码(四元式程序)为基本块的算法,其步骤如下: 1.求出四元式程序中各个基本块的入口语句。 2.对每一入口语句,构造其所属的基本块。它是由该入口语句到下一入口语句(不包括下一入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的语句序列组成的。 3.凡末被纳入某一基本块的语句、都是程序中控制流程无法到达的语句,因而也是不会被执行到的语句,我们可以把它们删除。 示例 基本块划分的示例 (1)P:=0 (2)I:=1 (3)T1:=4*I (4)T2:=addr(A)-4 (5)T3:=T2[T1] (6)T4:=4*I (7)T5:=addr(B)-4 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I=20 goto(3) 基本块的变换 基本块的主要保结构变换是: 1.删除公共子表达式 2.删除无用代码 3.重新命名临时变量 4.交换语句次序 示例 基本块变换的示例 重新命名: 语句t := b+c,其中t是临时变量。如果把这个语句改为u := b+c,其中u是新的临时变量,并且把这个t的所有引用改成u ,那么基本块的运算结果不变 交换语句次序: t1:=b+c t2:=x+y 如果基本块有两个相邻的语句,当且仅当x和y都不是tl,b和c都不是t2时,可以交换这两个语句的次序。 代数变换:可以把基本块计算的表达式集合变换成代数等价的集合。 简化表达式或用较快运算代替较设运算的变换。 例如: x := X+0 或 x := x*1 这样的语句可以从基本块中删除而不改变它计算的表达式集合,又如 x := y **2的指数算符通常要用函数调用来实现,使用代数变换,这个语句可由快速、等价的语句 x := y*y来代替。 基本块的DAG表示 概念 DAG的要素 DAG的表示 DAG的概念 在一个有向图中,称任一有向边m→n(或表示为有序对(m,n))中的结点m为结点n的前驱(分结),结点n为结点m的后继(子结)。 环路: 任一有向边序列n1→ n2,n2→n3,…,nk-1→ nk为从结点n1到结点nk的一条通路。如果其中n1

文档评论(0)

1亿VIP精品文档

相关文档