LIWensheng,SCST,BUPT第10章代码优化知识点:基本块优化循环优化窥孔优化dag的应用WenshengLiBUPT@20082/62代码优化10.1优化概述10.2基本块优化10.3dag在基本块优化中的应用10.4循环优化10.5窥孔优化小结WenshengLiBUPT@20083/62代码优化程序的任务–将前端产生的中间代码转换为等价的目标代码代码优化程序的要求–等价变换–提高目标代码的执行速度–减少目标代码占用的空间代码优化程序的地位–目标代码生成之前的中间代码优化–目标代码生成之后的目标代码优化10.1优化概述WenshengLiBUPT@20084/62代码优化程序的位置前端中间代码优化程序代码生成程序目标代码优化程序控制流分析数据流分析代码变换中间代码中间代码目标代码目标代码源程序WenshengLiBUPT@20085/62优化的主要种类基本块优化–基本块内进行的优化–常数合并与传播、冗余子表达式的删除、复制传播、削弱计算强度、死代码的删除等循环优化–在循环语句所生成的中间代码序列上进行的优化–循环展开、代码外提、削弱计算强度、删除归纳变量等全局优化–在非线性程序段上(含多个基本块)进行的优化窥孔优化–在目标代码上进行的优化–删除冗余的传送指令、删除死代码、控制流优化、强度削弱及代数化简等WenshengLiBUPT@20086/6210.2基本块优化一、常数合并及常数传播二、删除冗余的公共表达式三、复制传播四、削弱计算强度五、改变计算次序WenshengLiBUPT@20087/62一、常数合并及常数传播常数合并:将能在编译时计算出值的表达式用其相应的值替代x=2+3+y可代之以:x=5+y常数传播:用在编译时已知的变量值代替程序正文中对这些变量的引用PI:=3.14;D-to-R:=PI/180.0;3.14/180.00.01744i:=010:i:=0+1...ifi<10goto10i:=010:i:=i+1...ifi<10goto10...a[i]:=9.0...a[j]:=3.0b:=a[i]?WenshengLiBUPT@20088/62常数合并的实现在符号表中增加两个信息域–标志域:指示当前是否存在与该变量相关的常数。–常数域:如果常数存在,则该域存放的即是与该变量相应的当前常数值。常数合并时,注意事项:–不能将结合律与交换律用于浮点表达式,因为浮点运算的精度有限,这两条定律并非是恒真的。–不应将任何附加的错误引入WenshengLiBUPT@20089/62二、删除冗余的公共表达式在一个基本块中,当第一次对表达式E求值之后,如果E中的变量都没有改变,再次对E求值,则除E的第一次出现之外,其余的E都是冗余的公共表达式。删除冗余的公共表达式,用第一次出现时的求值结果代替...