LLVM L oop Упрощенный проход - PullRequest
0 голосов
/ 11 марта 2020

Я, вероятно, неправильно понимаю основную c концепцию, как работает LLVM & pass, во всяком случае, вот мой вопрос:

В настоящее время я работаю над проходом, где я расширяю runOnModule (https://llvm.org/doxygen/classllvm_1_1ModulePass.html ) функция. Я хотел бы сначала запустить LoopSimplify на ИК, но, похоже, я не понимаю, как это сделать. Существует функция запуска (Function & F, FunctionAnalysisManager & AM), описанная в https://llvm.org/doxygen/classllvm_1_1LoopSimplifyPass.html, и, насколько я понимаю, я могу вызывать ее для каждой функции в моем модуле. Но для этого мне нужен член этого класса (LoopSimplify), чтобы вызвать его, о котором я не знаю, где взять, а также некоторый FunctionAnalysisManager. Для чего они и как они должны выглядеть? Не похоже, что я могу просто передать ему несколько пустых конструкций, верно?

Я хочу сделать это для следующей гарантии: "L oop вставка перед заголовком гарантирует, что существует одна некритическая запись край от внешней стороны l oop до заголовка l oop. Это упрощает ряд анализов и преобразований, таких как LICM. " как описано в https://llvm.org/doxygen/LoopSimplify_8h_source.html.

1 Ответ

0 голосов
/ 20 апреля 2020

Несмотря на то, что я поддерживаю инструкции по интеграции вашего прохода с использованием менеджера проходов, тем не менее, есть способ заставить LoopSimplify запускаться, заставляя ваш пропуск требовать его. Это также используется во многих проходах, предоставляемых LLVM, таких как Scalar / LoopVersioningLICM. cpp

// This header includes LoopSimplifyID as an extern
#include "llvm/Transforms/Utils.h"
...
void YourPass::getAnalysisUsage(AnalysisUsage& AU) const {
  AU.addRequiredID(LoopSimplifyID);
}

Это заставит проход выполняться до вашего прохода, нет необходимости вызывать его. Однако, если вам нужен интерфейс с тем или иным проходом, вы можете запросить его анализ:

getAnalysis<LoopSimplifyPass>(F); // Where F is a function&
...