


本文主要介绍编译器优化中的过程间优化部分。实验环境是 CentOS7 + LLVM。
过程在高级语言中也称为函数或方法。
过程间分析指在整个程序范围内,在不改变程序代码和过程间的前提下,跨越过程边界进行信息收集,而不仅仅在单个过程内收集信息,从而为过程间优化提供足够多的信息的支持。编译器根据过程间分析所收集的过程间信息进行分析的操作,根据分析结果进行优化的操作称为过程间优化。过程间优化的目的是减少或消除重复计算、内存的低效使用,并简化循环等迭代序列,涉及程序中多个过程的程序变化与优化。LLVM在优化级别-O3就会开启过程间优化。
过程间优化常用的一种方法是内联优化。内联优化是指如果在循环中调用了另一个过程,过程间优化会确定最好的方式去内联该过程,并会对过程排序以获得更好的内存布局和局部性。内联优化的优点是一方面可以消除函数调用的开销,另一方面可以展开被调用函数的代码来创造更多的优化机会,在LLVM中通过-inline选项来打开内联优化功能,LLVM中会根据调用函数和被调用函数的大小来决定是否内联。
在开发和修改程序时可能遗留有死代码。死代码是指程序在一个完整的执行过程中没有得到任何运行的代码,也可能是一些声明了但没有用到的变量。编译器通常都以警告信息的形式告诉用户,并在编译时将这些无用变量丢弃。删除死代码可以减少程序的大小,还可以避免程序在运行中进行不相关的运算行为,减少运行的时间,并有助于后续的优化。
示例代码如下所示,将其命名为inline_optimization.c.

运行命令:
(1)clang inline_optimization.c -emit-llvm -S -O1 -o inline_optimization.ll
(2)opt inline_optimization.ll -S -inline -o inline_optimization-new.ll
利用命令(1)编译inline_optimization.c,再通过命令(2)对inline_optimization.ll内联优。
内联优化前(inline_optimization.ll)部分代码如下所示。

内联优化后(inline_optimization-new.ll)部分代码如下所示。


可见,过程间优化中的内联操作将add函数内联到了循环体中,减少了函数调用的入栈出栈开销,并且可以执行一些内联优化之前不会进行的优化,比如在本例中内联优化后的循环可以被向量化,LLVM在优化级别-O3选项下即开启过程间优化。
编译器根据过程间分析所收集的过程间信息进行分析的操作,根据分析结果进行优化的操作称为过程间优化。过程间优化常用的一种方法是内联优化。
(1)编译器 inline 内联优化简介 - 知乎 (zhihu.com)
(2)LLVM代码空间优化(一) 编译器自带的优化选项_llvm优化算法-CSDN博客


