Чтобы увидеть стандартные проходы для LLVM, вы можете попробовать проверить подклассы интерфейса Pass. Насколько мне известно, в самом LLVM API нет прохода, который бы запускал специальные проходы clang. Для этого вам нужно посмотреть clang.
Чтобы выяснить, какие именно проходы вы хотели бы добавить, посмотрите на
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
См. Где найти последовательность оптимизации для clang -OX? а>
Тем не менее, есть некоторые проблемы с поиском API, который вы используете, и так далее. То же самое можно применить и к Clang -O3.
Что вы можете сделать, если это возможно для вашего проекта, так это сгенерировать LLVM IR в файл на диске, а затем скомпилировать неоптимизированный LLVM IR с clang отдельно с флагом O3.
Вот как вы можете запустить некоторые проходы, используя устаревший диспетчер проходов. Предполагая, что у вас есть контекст LLVM.
module = llvm::make_unique<llvm::Module>("module",context); //Context is your LLVM context.
functionPassMngr = llvm::make_unique<llvm::legacy::FunctionPassManager>(module.get());
functionPassMngr->add(llvm::createPromoteMemoryToRegisterPass()); //SSA conversion
functionPassMngr->add(llvm::createCFGSimplificationPass()); //Dead code elimination
functionPassMngr->add(llvm::createSROAPass());
functionPassMngr->add(llvm::createLoopSimplifyCFGPass());
functionPassMngr->add(llvm::createConstantPropagationPass());
functionPassMngr->add(llvm::createNewGVNPass());//Global value numbering
functionPassMngr->add(llvm::createReassociatePass());
functionPassMngr->add(llvm::createPartiallyInlineLibCallsPass()); //Inline standard calls
functionPassMngr->add(llvm::createDeadCodeEliminationPass());
functionPassMngr->add(llvm::createCFGSimplificationPass()); //Cleanup
functionPassMngr->add(llvm::createInstructionCombiningPass());
functionPassMngr->add(llvm::createFlattenCFGPass()); //Flatten the control flow graph.
Затем они могут запускаться
functionPassMngr->run(getLLVMFunc());
Если бы getLLVMFunc вернул бы llvm::Function*, который вы сейчас генерируете. Обратите внимание, что здесь я использую устаревший менеджер проходов, причина в том, что clang использует устаревший менеджер проходов внутри.
person
JKRT
schedule
12.12.2018