830 likes | 971 Views
第九章 机器无关的优化. 主要内容. 引言 优化的来源 数据流分析 循 环的识别、分析和优化. 引言. 代码优化或者代码改进 在目标代码中消除不必要的指令 把一个指令序列替换为一个完成相同功能的更快的指令序列 全局优化 有哪些可能的优化或改进机会? 具体的优化实现基于数据流分析技术 用以收集程序相关信息的算法。. 优化的来源. 程序的冗余 冗余是使用高级程序设计语言编程的副产品 通过抽象的易于书写的方式编程和程序的高效之间存在矛盾。 给编译器提供了优化的机会。. 优化的示例. 快速排序. 优化的示例(续). 优化的示例(续).
E N D
主要内容 • 引言 • 优化的来源 • 数据流分析 • 循环的识别、分析和优化
引言 • 代码优化或者代码改进 • 在目标代码中消除不必要的指令 • 把一个指令序列替换为一个完成相同功能的更快的指令序列 • 全局优化 • 有哪些可能的优化或改进机会? • 具体的优化实现基于数据流分析技术 • 用以收集程序相关信息的算法。
优化的来源 • 程序的冗余 • 冗余是使用高级程序设计语言编程的副产品 • 通过抽象的易于书写的方式编程和程序的高效之间存在矛盾。 • 给编译器提供了优化的机会。
优化的示例 • 快速排序
优化的示例(续) • 全局公共子表达式 • 表达式E之前出现过,其中的变量值都没有改变过,多次出现这样的E可以被称为公共子表达式。 • 如果E上一次计算结果赋予变量x,且x的值中间没有被改变,那么就可以使用x而避免重新计算E。 • 例9.1:局部优化 • 例9.2: 考虑B2、B3和B5、B6中 的公共子表达式
优化的示例(续) • 消除公共子表达式后的流图
优化 - 复制传播 • 复制语句:形如u=v这样的复制表达式 • 复制语句的产生,有时是由其公共子表达式消除优化引入的。 • 复制传播转换的基本思想 是在复制语句u=v之后尽 可能的用v来替代u。
优化 - 死代码的消除 • 活跃:一个变量在一个程序点上的值可能会在以后被使用,那么这个变量在该点活跃。 • 死:不活跃 • 死代码:其计算结果用于不会被使用的语句。 • 常量折叠会产生一些死代码。 • 复制传播也会把一些复制语句变成死代码。
优化 - 代码移动 • 尽可能减少内部循环的指令可能,即使可能增加循环外的指令个数也是值得的。 • 循环不变表达式:无论循环多少次,表达式的值都不会变化的表达式。 • 代码移动:在进入循环前,对循环不变表达式进行求值。
优化 - 归纳变量和强度削减 • 归纳变量:对于一个变量x,如果存在一个正的或负的常数c使得每次x被赋值时它的值总是增加c,那么x被称为归纳变量。 • 例如图9.5 B2中的i和t2。 • 强度削减:把一个高代价的运算(比如乘法)替换为一个代价较低的运算(比如加法)的转换称为强度削减。 • 如果有一组归纳变量的值的变化保持步调一致,常常可以将这组变量删除只剩一个。
优化 - 归纳变量和强度削减(例) • 例9.6
优化 - 归纳变量和强度削减(例) • 删除具有同步调变化的归纳变量
B1 B5 B6 B2 B3 B4 Flow Graph if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination(全局) if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Common Subexpression Elimination Similarly for B6 if i >= j goto B6
B1 B5 B6 B2 B3 B4 Copy Propogation & Dead Code Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Dead Code Elimination if i >= j goto B6
B1 B5 B6 B2 B3 B4 Reduction in Strength if i >= j goto B6
B1 B5 B6 B2 B3 B4 Reduction in Strength if i >= j goto B6
B1 B5 B6 B2 B3 B4 Induction Variable Elimination if t2>= t4goto B6
数据流分析 • 上述所有的优化都依赖于数据流分析 • 数据流分析是一组用来获取有关数据如何沿着程序执行路径流动的相关信息的技术。 • 全局公共子表达式:需要确定表达式中变量的值是否改变 • 死代码消除:需要确定某一个赋值语句的结果是否被后续使用 • ……
数据流分析相关概念 • 程序点 • 基本块中的位置,包括:第一个语句之前,两个相邻语句之间,和最后的语句之后。 • 路径 点序列p1, p2, …, pn,对1和n - 1间的每个i,满足 • pi是一个语句前的点,pi+1是同一块中位于该语句后的点,或者 • pi是某块的结束点,pi+1是后继块的开始点 • 程序状态:程序中所有变量在某个程序点的取值。
数据流抽象的例子 • 从程序状态中获取我们感兴趣的抽象信息 • 第一次到程序点(5) a的值为1。以后到达 该点时a的值为243。 • 可以得出一个抽象信息, a的值集合是{1,243}, 而它由{d1,d2}定值。
数据流分析的模式 • 各个程序点上可能的程序状态,可以帮助我们进行数据流的分析。 • 每个程序点和一个数据流值相关联,这个值是在该点可能观察到的所有程序状态的集合的抽象表示。 • 在各种数据流分析中,每个程序点和一个数据流值相关联。不同的数据流分析,数据流值的类型可能不同。 • 在程序中一个语句之前和之后的数据流值可能会发生改变,需要描述这种改变(IN[s]和OUT[s]分别表示每个语句s之前和之后的数据流值): • 传递函数 • 正向OUT[s]=fs(IN[s]) • 逆向IN[s]=fs(OUT[s]) • 控制流约束 • 假设基本块B的语句s1,s2,…sn, IN[si+1]=out[si], i=1,2,…,n-1
数据流分析的模式 --基本块上的数据流模式 • 进入和离开基本块时的数据流值分别是IN[B]和OUT[B] • 假设基本块由语句s1,s2,…sn顺序组成。那么s1是基本块B的第一个语句,IN[B]=IN[s1]。 sn是B的最后一个语句,那么OUT[B]=OUT[sn]。我们可以用fs的传递函数来计算基本块B的传递函数fB=fsn·…fs2·fs1 。 • OUT[B]=fB(IN[B]) • 基本块间的控制流约束 • IN[B]=∪P是B的一个前驱OUT[P] • 逆向数据流 • IN[B]=fB(OUT[B]) • OUT[B]=∪S是B的一个后继IN[S]
数据流分析 • 到达定值分析 • 活跃变量分析 • 可用表达式分析
到达定值分析相关概念 • 定义/定值[definition]:使变量x(可能)获得值的语句称为对x的定值,一般用语句的位置表示。 • 变量获得值的方式: • 通过赋值语句; • 通过输入语句; • 通过过程形式参数; • 通过过程副作用(局部过程引用全局变量) • 指针等 • 使用/引用点[reference]:引用某个变量x的语句的位置称为x的引用点。
到达定值分析相关概念(续) • 到达-定值:假定x有定值d,如果存在一个路径,从紧随d的点到达某点p,并且此路径上面没有x的其他定值点,则称x的定值d到达p。如果在这条路径上有对x的其它定值,我们就说变量x的这个定值被“杀死”了。 • 如果某个变量x的一个定值d到达了点p,在p点使用变量x的时候,x的值是由d最后定值的。
到达定值流图示例 • GEN[B]:各个变量在B内定值,并能够到达B的出口点的所有定值的集合。 • KILL[B]:是各个变量在基本块B中重新定值,从而被注销的定值点的集合。
到达定值的数据流分析 -- 传递方程 • 考虑一个定值 d: u=v+w • fd(x)=gend∪(x-killd), gend={d}, killd是程序中所有其它对u的定值。 • 请注意,在到达定值分析中,x是指程序的定值集合。 • 语句的传递函数可以组合构造。 • f1(x)=gen1∪(x-kill1), f2(x)=gen2∪(x-kill2)
到达定值的数据流分析 -- 传递方程(续) • 对于一个基本块的生成和杀死定值集合,gen中包含了所有在紧靠基本块之后的点上“可见”的该基本块中的定值,它们被称为向下可见。 • 在一个基本块中,一个定值是向下可见的,仅当它没有被同一个基本块中较后的对同一变量的定值“杀死”。 • 一个基本块的kill集是所有被块中各个语句杀死的定值的集合。 • 一个定值可能同时出现在基本块的gen集和kill集中。该定值会被该基本块生成 • 例9.10
到达定值的数据流分析 --控制流方程 • 只要有一个定值能够沿着至少一条路径到达某个程序点,那么这个定值就到达该程序点。 • IN[B]=∪P是B的一个前驱OUT[P]
到达定值分析的数据流分析方程组 • 假设流图的两个空基本块,开始块ENTRY和出口块EXIT。 边界条件 传递方程 控制流方程
到达定值的迭代算法 • 对方程组进行求解 • 输入:一个流图,已知每个基本块B的killB集和genB集。 • 输出:到达流图中每个基本块B的入口点和出口点的定值集合,即 IN[B]和OUT[B]。 • 迭代算法,逐步逼近想要求得的IN和OUT。
到达定值迭代算法示例 • 求解过程:
到达定值迭代算法示例(续) • 比较OUT[B2]的变化