开放源码编译器ORC系统中若干优化技术
【摘要】:
编译器在提高程序运行速度和发挥处理器性能方面起着非常关键的作用,尤其在显式并行的体系结构中,编译器的作用更是举足轻重。在这种体系结构的处理器中,找出可并行指令的任务由编译器完成,编译器可以针对体系结构的特性进行特定的优化。
本文介绍超长指令字体系结构处理器Itanium的编译系统ORC(开放源代码编译器)后端的优化,主要包括:
机器模型:封装目标机微体系结构的具体细节,从而使得编译器主体在一定程度上与机器无关,具有较好的可移植性。
对Profiling的支持:Profiling技术使得编译器利用运行时信息对程序进行有针对性的优化,以取得更好的效果。
基于区域的编译优化技术:编译器将函数划分为若干具有良好性质且规模可控的区域,将分析和优化的范围局限于单个区域中,从而获得更好的代码质量和编译时空效率。
谓词分析:谓词分析通过分析带有谓词的代码,确定谓词之间的关系,提供接口供其它分析和优化模块查询,从而可以获得更精确和更好的效果。
If-转换:利用IA-64对条件执行的支持,消除程序中的某些控制流,以利于优化。
全局指令调度:指令调度的任务是在满足依赖关系、资源约束及硬件施加的其它约束条件的前提下,重新排定指令执行的顺序,提高资源利用率。
投机与恢复代码生成:投机是指在结果有用与否尚属未知的情况下,即调度指令执行。投机失败时,利用恢复代码保持程序正确语义。
本文重点介绍了基于region的传统优化技术-控制流优化。在传统编译器中,控制流优化是基于函数的,包括分支跳转优化、消除不可到达基本块等。在orc中,采用region作为分析和优化的范围,而在region形成后还要进行控制流优化,而这种优化可能会改变控制流图,因此需要在优化的同时维护region的属性。
最后基于ORC平台,研究了一种基于region的动态重用技术。经验发现很多程序在执行时有很多指令和指令段具有相同的输入,并产生相同的输出。这些指令段可以不被重复执行,而是利用已经执行过的结果。这里提出了一种利用基于region的编译技术对指令段进行重用的方法。该方法在ORC原有的技术上作了一些改进,不需要额外的硬件支持。首先利用value profiling信息找出可能会发生重复执行的指令段,称之为region。对每个region进行库函数调用,这些库函数把region上次执行的输入和输出值记录到一个信息文件中。程序运行中如果发现一个region具有可重用的结果,整个region不再被执行,从而提高程序的执行效率。