LLVM (3.5+) PassManager vs LegacyPassManager

LLVM (3.5+) PassManager vs LegacyPassManager

本文关键字:PassManager vs LegacyPassManager LLVM      更新时间:2023-10-16

我正在使用LLVM C++API开发一种新语言,并希望利用优化过程。(注意:我目前正在使用最新的源LLVM,我认为它相当于3.8)

我还没有找到任何使用新PassManager的例子,甚至Clang仍在使用LegacyPassManager。

我遇到过这样的帖子,这些帖子已经有好几年的历史了,提到了新的PassManager,但它们仍然使用传统的系统。

有没有关于如何使用这个新的(ish)PassManager的示例/教程?新的LLVM项目应该更喜欢PassManager而不是LegacyPassManager吗?Clang是否计划迁移,或者这就是Legacy系统一直存在的原因?

根据我在#llvm IRC:的帮助下收集的信息

FunctionPassManager FPM;
//Use the PassInfoMixin types
FPM.addPass(InstCombinePass());
//Register any analysis passes that the transform passes might need
FunctionAnalysisManager FAM;
//Use the AnalysisInfoMixin types
FAM.registerPass([&] { return AssumptionAnalysis(); });
FAM.registerPass([&] { return DominatorTreeAnalysis(); });
FAM.registerPass([&] { return BasicAA(); });
FAM.registerPass([&] { return TargetLibraryAnalysis(); });
FPM.run(*myFunction, FAM);

但为了避免手动注册每个通行证的麻烦,您可以使用PassBuilder来注册分析通行证

FunctionPassManager FPM;
FPM.addPass(InstCombinePass());
FunctionAnalysisManager FAM;
PassBuilder PB;
PB.registerFunctionAnalyses(FAM);
FPM.run(*myFunction, FAM);

扩展Lukes答案,使用PassBuilder,您可以构建具有不同优化级别的预定义"开箱即用"简化管道:

llvm::FunctionAnalysisManager FAManager;
llvm::PassBuilder passBuilder;
passBuilder.registerFunctionAnalyses(FAManager);
passBuilder.buildFunctionSimplificationPipeline(
        llvm::PassBuilder::OptimizationLevel::O2,
        llvm::PassBuilder::ThinLTOPhase::None);

这将向CCD_ 3添加一组通行证。这可能会简化你的生活。查看为每个OptimizationLevel添加的全套过程的最佳位置是原始源。