LLVM(3.5+)PassManager与LegacyPassManager

Mat*_*ers 12 c++ compiler-construction llvm

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

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

我所遇到的职位,如是几年前的,现在提及新PassManager,但他们都仍然使用旧系统.

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

Luk*_*uke 5

根据我在#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);
Run Code Online (Sandbox Code Playgroud)

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

FunctionPassManager FPM;
FPM.addPass(InstCombinePass());

FunctionAnalysisManager FAM;

PassBuilder PB;
PB.registerFunctionAnalyses(FAM);

FPM.run(*myFunction, FAM);
Run Code Online (Sandbox Code Playgroud)


Win*_*lds 5

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

llvm::FunctionAnalysisManager FAManager;
llvm::PassBuilder passBuilder;

passBuilder.registerFunctionAnalyses(FAManager);

passBuilder.buildFunctionSimplificationPipeline(
        llvm::PassBuilder::OptimizationLevel::O2,
        llvm::PassBuilder::ThinLTOPhase::None);
Run Code Online (Sandbox Code Playgroud)

这将添加一堆通行证到FunctionAnalysisManager. 这可能会简化您的生活。查看为每个添加的全套通行证的最佳位置OptimizationLevel原始来源