我正在使用LLVM C ++ API处理一种新语言,并希望利用优化传递。 ( 注意: 我目前正在使用来自源LLVM的最新版本,我认为相当于3.8)
我还没有找到任何使用新PassManager的示例,甚至Clang仍在使用LegacyPassManager。
我遇到了this这样的帖子,这些帖子已有几年了,现在提到了新的PassManager,但它们仍然使用旧系统。
是否有关于如何使用这个新的(ish)PassManager的示例/教程?新的LLVM项目是否应该更喜欢PassManager到LegacyPassManager? Clang是否计划迁移,或者这就是Legacy系统陷入困境的原因?
答案 0 :(得分:4)
从我在#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);
答案 1 :(得分:3)
扩展Lukes的答案,PassBuilder
你可以构建预定义的#34;开箱即用"简化管道具有不同的优化级别:
llvm::FunctionAnalysisManager FAManager;
llvm::PassBuilder passBuilder;
passBuilder.registerFunctionAnalyses(FAManager);
passBuilder.buildFunctionSimplificationPipeline(
llvm::PassBuilder::OptimizationLevel::O2,
llvm::PassBuilder::ThinLTOPhase::None);
会向FunctionAnalysisManager
添加一堆传递。这可能会简化您的生活。查看为每个OptimizationLevel
添加的完整通行证集的最佳位置是the original sources。