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。不过,仍在调查两者的区别。