gcc各种优化所在位置及循环展开分析

 

 

gcc各种优化所在位置及循环展开分析

 

gcc各种优化所在位置及循环展开分析

GENERIC 是一种树(tree)的高级表示形式,目的是提供一个语言无关的中间表示。

 

当前 GCC 的主要优化都是基于 GIMPLE 表示形式实现的,包括过程间优化、传统标量优化、循环优化、向量化等。

 

GCC 的 all_passes 遍表中的 expand 过程将 GCC 的 GIMPLE 表示形式转化为另外一种表示形式 RTL。

RTL 相当于一种面向带有无限数量寄存器的抽象机器的汇编语言,能够表示很多低级特征,例如寄存器、存储寻址模式、字大小类型、比较-分支指令、调用约定、位域操作、类型转换等。在 RTL 表示形式上实现的优化包括寄存器分配、指令调度、软流水、循环优化等。

 

GCC 对编译遍进行了分类,按处理级别可分为 IPA 遍、GIMPLE 遍和 RTL 遍。IPA 遍主要包括过程间优化,可以使用程序全局信息;GIMPLE 遍与 RTL 遍属于过程内优化,只能使用函数内的局部信息,GIMPLE 遍处理的对象处于 GIMPLE中间表示形式,而 RTL 遍处理的对象处于 RTL 中间表示形式。

 

 

循环展开

 

一种优化也可能在多个编译遍中实现。循环展开优化技术在三 个 编 译 遍 中 实 现 : pass_complete_unrolli 、 pass_complete_unroll 和pass_rtl_unroll_and_peel_loops,前两个优化遍是 GIMPLE 遍,处理 GIMPLE 中间表示代码,最后一个优化遍是 RTL 遍,处理 RTL 中间表示代。两个 GIMPLE循环展开遍的功能相同,都是对循环进行完全展开,即展开次数等于循环迭代次数;

RTL 循环展开遍则是包含了循环展开优化和循环剥皮优化。