Выполнение стандартной оптимизации проходит на модуле LLVM - PullRequest
0 голосов
/ 27 ноября 2018

Допустим, у меня есть действующий модуль LLVM:

std::unique_ptr<llvm::Module> module;

Я хочу запустить на нем традиционные проходы оптимизации LLVM:

llvm::PassBuilder passBuilder;
llvm::ModulePassManager modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O3);
llvm::ModuleAnalysisManager moduleAnalysisManager;
passBuilder.registerModuleAnalyses(moduleAnalysisManager);
modulePassManager.run(*module, moduleAnalysisManager);

К сожалению, сбой вызова и отладка показывают, чтоmoduleAnalysisManager имеет только проходы модуля, но не функциональные, заключенные в прокси-класс.

Как мне настроить modulePassManager для обработки всех проходов (модуля) определенного уровня?У меня нет отдельных функций, поэтому я не могу запустить передачи функций только на них.

1 Ответ

0 голосов
/ 27 ноября 2018

Правильный способ LLVM - создать все analysisManager с, а затем связать их все вместе.Давайте начнем с их создания:

llvm::PassBuilder passBuilder;
llvm::LoopAnalysisManager loopAnalysisManager(true); // true is just to output debug info
llvm::FunctionAnalysisManager functionAnalysisManager(true);
llvm::CGSCCAnalysisManager cGSCCAnalysisManager(true);
llvm::ModuleAnalysisManager moduleAnalysisManager(true);

Затем мы регистрируем каждого менеджера индивидуально, а затем перекрестно регистрируем их.Это означает, что количество менеджеров здесь фиксировано, и если LLVM (7 в настоящее время) меняет количество менеджеров, его необходимо адаптировать:

passBuilder.registerModuleAnalyses(moduleAnalysisManager);
passBuilder.registerCGSCCAnalyses(cGSCCAnalysisManager);
passBuilder.registerFunctionAnalyses(functionAnalysisManager);
passBuilder.registerLoopAnalyses(loopAnalysisManager);
// This is the important line:
passBuilder.crossRegisterProxies(
    loopAnalysisManager, functionAnalysisManager, cGSCCAnalysisManager, moduleAnalysisManager);

После создания passBuilderнаконец, мы можем выполнить этапы оптимизации для модуля с помощью вызова moduleAnalysisManager.

llvm::ModulePassManager modulePassManager =
    passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O3);
modulePassManager.run(*module, moduleAnalysisManager);

Это будет запускать проходы на уровне модуля, а также все внутренние проходы, которые LLVM может выполнять на элементах модуля.(уровень функции, уровень петли ...).

...