
结合 GCC 4.0 代码中的部分源文件来说明:图 5 中这个 Tree Optimizer 的行为是由tree-optimize.c 文件驱动的,tree-ssa.c, tree-into-ssa.c 以及 tree-outof-ssa.c 负责完成 SSA 形式的转换、验证以及其他需要与 SSA 形式交互的功能,建立和管理控制流转换图 CFG 的工作由 tree-cfg.c 完成。不同的树分析和优化功能分别在相应的源文件中独立实现,这些分析和优化函数必须向 GCC 注册,然后才能由 tree-optimize.c 进行驱动和管理,结合图 5来看,SSA pass1, SSA pass2 … SSA passn 代表了实现各种不同功能的 SSA 分析器,他们向 Tree Optimizer 注册,在编译时刻 Tree Optimizer 根据编译选项等等选择相应的SSA分析器进行优化或者其他处理工作,并保证在基于 SSA 形式的处理完成之后将 SSA 树转换成非 SSA树,交给下面的 RTL 模块处理。
至此,GCC 4.0 的 Tree SSA 优化框架结构应该比较清楚了。读者可能会注意到,文中多次提到Tree SSA是一个优化框架结构(Optimization Infrastructure),为什么说是一个Infrastructure 呢?其实把 Infrastructure 称作框架结构或许并不贴切,更精确地说 Tree SSA是 GCC 提供的一种进行优化工作的基础设施。图 5 中已经体现出了这一点,Tree SSA 的分析和优化工作不是一成不变的,具体选择哪些优化功能和算法是由Tree Optimizer选择驱动的,而且这个Infrastructure是相当灵活的,我们可以很方便的加入一个 SSA 分析器,只需要如下步骤:
1. 创建一个 struct tree_opt_pass 类型的全局变量。
2. 在 tree-pass.h 头文件中为这个新的分析器添加一个外部声明(extern declaration)。
3. 调用 NEXT_PASS 把这个新的分析器加入到 tree-optimize.c: init_tree_optimization_passes 序列中。
所以这种 Infrastructure 是一个相当灵活和方便的设计,使得我们可以便利地加入新的SSA 分析器,或者使用更高效的算法来重新设计完成一些优化功能等等。
4. 总结
GCC 4.0 发布以来得到了引起了广泛的关注,新的 gfortran 前端给 Fortran 程序员带来了福音,但也有很多不尽如人意的地方,比如编译性能的损耗,以及向后兼容问题。比如KDE(K Desktop Environment) 开发小组在发现 GCC 4.0 无法正常编译 KDE 后,迅速的抛弃了 GCC 4.0。而且,出于稳定性的考虑,GCC 3.x 版本的开发仍然在进行中。这些似乎给 GCC 4.0 的前景笼罩上了一层阴影,但我们应该容忍一点,给 GCC 4.0 一些信心,向后兼容的问题应该是能够解决的。
至于编译性能的问题,通过我们这篇文章的讨论,我们可以看到 GCC 4.0 Tree SSA 的优化框架结构并没有充分发挥出其潜能,还可以增加和改进更多 Tree SSA 的优化工作,假以时日,GCC 4.0 的编译性能会得到提高的。
总的来说,这次 GCC 从 3.x 版本跃迁到 4.x 版本更像一个进化 (evolution) 的过程,而非一个革命性 (revolution) 的过程,它采用的 Tree SSA 优化框架代表了编译器发展的方向,我们应该关注 GCC 4.0 的进一步发展。
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 特性 GCC SSA Tree 编译 优化 形式 4.0 一个 进行 程序 |
注册
个人空间
