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 将内联器安排到其现有的模块级优化管道中。
通过阅读 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 将内联器安排到其现有的模块级优化管道中。