LLVM 模块级内联器`ModuleInlinerWrapperPass` 用法

LLVM module-level inliner `ModuleInlinerWrapperPass` usage

通过阅读 lib/Transforms/IPO/Inliner.cpp 中 LLVM 的源代码,我发现 LLVM 将实际的内联通道设计为 CGSCC 通道,然后 ModuleInlinerWrapperPass 环绕 CGSCC 通道以执行每个操作-模块内联。

窥视 PassBuilder.cpp,我发现模块级内联包装器传递通常也是 运行 在 PGO 检测阶段(作为 addPGOInstrPipeline 管道的一部分)作为LTO阶段。

我对 CGSCC pass 和模块级 pass 之间的差异感兴趣,以及哪一个被安排得更早,所以我添加了一些 LLVM_DEBUG 语句来从模块级 pass 的初始化程序中打印。似乎默认 opt -O2 不 运行 模块级内联;相反,它 运行CGSCC 在优化管道中很早就通过了。

我的问题是:优化管道中的模块级内联层传递 运行 何时(如果有),它与 CGSCC 内联层传递有什么关系?

这个问题归结为LLVM中新PassManager和旧PassManager的区别。

基本上,有两种方法可以编写通行证:我们可以使用新的 PassManager(使用 pass classes 扩展 PassInfoMixin<...>)或使用旧版 PassManager(使用 pass classes 扩展 ModulePass/CGSCCPass/FunctionPass...).

新的 PassManager 使用 PassBuilder class 将传递安排到管道中,然后 运行 按照安排的顺序安排管道。 ModuleInlinerWrapperPass 本质上是一个模块级包装器通道,以便新的 PassManager 将内联器安排到其现有的模块级优化管道中。