传统的过程內分析,采用很保守的策略,假设所有对过程可见的变量都可能改变,并默认所有可能的操作都有副作用,因此过程內分析和优化非常简单。函数调用对于优化策略来说,隐藏了副作用的信息,虽然inline能够将副作用信息暴露给调用者,但这会大大增加代码量并降低指令局部性,而且并非所有的函数都能inline(如,对于不可预测副作用的函数)。过程间分析(InterProcedural Analysis)就应运而生,被用来作程序调用分析,能够处理inline不能处理的问题。删除不必要的函数调用,做指针和常数传播等。
IPA 提供了完全不同的策略,先分析过程內的信息,如别名和依赖关系,然后将这些信息在调用图(根据过程间的调用关系得到的图)中传播,然后就可以利用这些信息决定将函数特殊化,移除函数中的某些不可能经过的路径或者内联函数。通过这些分析,能降低编译器对存储依赖的不确定性。目前还很活跃的编译器都支持了过程间分析和优化,例如gcc -O3就能默认打开优化,open64可以使用-ipa打开,LLVM也有强大的链接时过程间优化,ICC也有。 Continue reading »

近期评论