LLVM(3.5+)PassManager vs LegacyPassManager

时间:2015-12-13 19:33:50

标签: c++ compiler-construction llvm

我正在使用LLVM C ++ API处理一种新语言,并希望利用优化传递。 ( 注意: 我目前正在使用来自源LLVM的最新版本,我认为相当于3.8)

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

我遇到了this这样的帖子,这些帖子已有几年了,现在提到了新的PassManager,但它们仍然使用旧系统。

是否有关于如何使用这个新的(ish)PassManager的示例/教程?新的LLVM项目是否应该更喜欢PassManagerLegacyPassManagerClang是否计划迁移,或者这就是Legacy系统陷入困境的原因?

2 个答案:

答案 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