理论教育 编译器设计之路:全局优化和数据流分析

编译器设计之路:全局优化和数据流分析

时间:2023-11-04 理论教育 版权反馈
【摘要】:绝大部分全局优化都是基于数据流、控制流实现的,这也是它与局部优化最主要的差异。相对而言,局部优化则较少依赖于数据流信息。对于那些不考虑数据流、控制流分析的小型编译器而言,基于DAG实现的代码重写算法是一个不错的选择,它的优化效果也是令人满意的。由于全局优化需要处理大量复杂的数据流分析,所以数据流分析将是本章的一个重要话题。

编译器设计之路:全局优化和数据流分析

在编译技术中,通常将优化算法分为三类:过程间优化、过程内优化、块内优化(即基本块内优化)。

下面先来看看过程内优化、块内优化。在很多编译原理的书籍中,将前者称为“全局优化”,而将后者称为“局部优化”。相对而言,局部优化的实现难度要远低于全局优化,从理论上来说,局部优化能达到的优化效果都可以由相应的全局优化实现。那么,是否意味着局部优化已经失去了存在的价值呢?答案是否定的。实际上,在某些场合,考虑到全局优化的实现代价或可行性等因素,编译器设计者更愿意选择局部优化而不是全局优化。

绝大部分全局优化都是基于数据流、控制流实现的,这也是它与局部优化最主要的差异。数据流分析是一项比较复杂的工程,尤其是处理指针、引用等元素时,可能很难精准地分析其引用、定值情况。当然,有时为了便于实现,一些消极的分析方法也是可以接受的。

相对而言,局部优化则较少依赖于数据流信息。例如,基于DAG的代码重写就是一个典型的局部优化算法,它的优化过程几乎很少需要数据流、控制流信息的支持,但它却依然能够实现块内的常量折叠、常量传播、复写传播等优化效果。对于那些不考虑数据流、控制流分析的小型编译器而言,基于DAG实现的代码重写算法是一个不错的选择,它的优化效果也是令人满意的。而这种代码重写算法的实现代价视具体IR形式而定,一般来说,它更偏向于树型结构的IR。(www.daowen.com)

在早期,由于过程间优化的实现代价及执行效率都相对较大,因此很多研究认为过程间分析、优化都是徒劳的。当然,更多的原因是鉴于过程间优化的效率。20世纪80年代末,Richardson、Ganapathi就研究分析了过程间优化的作用及其效率,研究发现过程间优化的成效是显著的,但是其效率却是相对较低的,常常使编译速度大幅度降低。同时,发现具有一般意义的过程间优化是相对复杂的,对编译器的设计与实现提出了较高的要求。因此,在经典编译技术中,很少涉及过程间优化的话题。不过,过程间优化在并行编译领域的价值是令人兴奋的。

Neo Pascal涉及的IR优化算法大多属于全局优化。由于全局优化需要处理大量复杂的数据流分析,所以数据流分析将是本章的一个重要话题。下面,将详细讲解数据流分析算法及其实现。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈