Clang LLVM模块级inliner`ModuleInlinerWrapperPass`用法

Clang LLVM模块级inliner`ModuleInlinerWrapperPass`用法,clang,llvm,compiler-optimization,llvm-clang,Clang,Llvm,Compiler Optimization,Llvm Clang,通过阅读lib/Transforms/IPO/Inliner.cpp中LLVM的源代码,我发现LLVM将实际的内联过程设计为CGSCC过程,然后有ModuleInlinerWrapperPass围绕CGSCC过程进行每个模块内联 查看PassBuilder.cpp,我发现模块级内联包装器过程通常在PGO检测阶段(作为addPGOInstrPipeline管道的一部分)以及LTO阶段运行 我感兴趣的是CGSCC过程和模块级过程之间的差异,以及哪一个是较早计划的,因此我添加了一些LLVM_调试语句,

通过阅读
lib/Transforms/IPO/Inliner.cpp中LLVM的源代码,我发现LLVM将实际的内联过程设计为CGSCC过程,然后有
ModuleInlinerWrapperPass
围绕CGSCC过程进行每个模块内联

查看
PassBuilder.cpp
,我发现模块级内联包装器过程通常在PGO检测阶段(作为
addPGOInstrPipeline
管道的一部分)以及LTO阶段运行

我感兴趣的是CGSCC过程和模块级过程之间的差异,以及哪一个是较早计划的,因此我添加了一些LLVM_调试语句,以便从模块级过程的初始值设定项打印。似乎默认情况下,
opt-O2
不运行模块级内联线;相反,它在优化管道的早期运行CGSCC过程


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

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

基本上,有两种方法可以编写密码:要么使用新的密码管理器(密码类扩展为
PassInfoMixin
),要么使用旧密码管理器(密码类扩展为
ModulePass
/
CGSCCPass
/
FunctionPass
…)


新的PassManager使用
PassBuilder
类来计划进入管道的过程,然后按照计划的顺序运行管道。
ModuleInlinerWrapperPass
本质上是一个模块级包装过程,以便新的PassManager将内联线安排到其现有的模块级优化管道中。

这个问题归结为LLVM中新的PassManager和旧的PassManager之间的差异

基本上,有两种方法可以编写密码:要么使用新的密码管理器(密码类扩展为
PassInfoMixin
),要么使用旧密码管理器(密码类扩展为
ModulePass
/
CGSCCPass
/
FunctionPass
…)


新的PassManager使用
PassBuilder
类来计划进入管道的过程,然后按照计划的顺序运行管道。
ModuleInlinerWrapperPass
本质上是一个模块级包装过程,以便新的PassManager将内联线安排到其现有的模块级优化管道中。

似乎是新的PassManager引入的。运行
clang-feexperimentalnewpassmanager
将正确调用ModuleInlinerWrapperPass。不过,我们仍在调查两者之间的区别。这似乎是新的PassManager引入的东西。运行
clang-feexperimentalnewpassmanager
将正确调用ModuleInlinerWrapperPass。不过,仍在调查两者的区别。