Чтобы узнать, что такое стандартные проходы для LLVM, вы можете попробовать проверить подклассы интерфейса Pass.Насколько я знаю, нет прохода, который запускает специфичные для clang проходы в самом API LLVM.Для этого вам нужно взглянуть на clang.
Чтобы выяснить, какие именно проходы вы хотели бы добавить, посмотрите на
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
См. Где найти последовательность оптимизации для clang-OX?
Тем не менее, возникают некоторые трудности, поиск используемого вами API и так далее.То же самое можно применить к Clang -O3.
Что вы можете сделать, если это возможно для вашего проекта, это сгенерировать IR LLVM для файла на диске и затем скомпилировать неоптимизированный IR LLVM с clang отдельно с O3flag.
Вот как вы можете запустить некоторые проходы, используя устаревший менеджер проходов.Предполагая, что у вас есть контекст 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 использует устаревший менеджер пропусков внутри.