首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用现代LLVM运行默认优化管道

使用现代LLVM运行默认优化管道
EN

Stack Overflow用户
提问于 2018-12-12 08:27:44
回答 2查看 1.5K关注 0票数 3

我使用的是LLVM 7,我有一个llvm::Module,我想使用标准的优化管道来优化它。不幸的是,我无法调用llvm::runDefaultOptimizations函数。在LLVM中,似乎有无数种优化模块的方法。我对这个主题的搜索发现了许多旧的/折旧的API和一些在我的系统上不起作用的例子。

我想在-O3上运行所有的标准优化,尽可能少的麻烦。我不想手动列出所有的通行证,甚至不想写一个for循环。我认为llvm::PassBuilder::buildModuleOptimizationPipeline可能是解决方案,但是当我尝试使用这个函数时,我会得到一个链接器错误,我认为这是非常奇怪的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-14 05:01:12

最后,我获得了opt工具(在这里发现的)的源代码,并剥离了我不需要的所有内容。最后我得到了这个:

代码语言:javascript
运行
复制
#include <llvm/IR/Verifier.h>
#include <llvm/Transforms/IPO.h>
#include <llvm/IR/LegacyPassManager.h>
#include <llvm/Target/TargetMachine.h>
#include <llvm/Analysis/TargetLibraryInfo.h>
#include <llvm/Analysis/TargetTransformInfo.h>
#include <llvm/Transforms/IPO/PassManagerBuilder.h>

namespace {

void addOptPasses(
  llvm::legacy::PassManagerBase &passes,
  llvm::legacy::FunctionPassManager &fnPasses,
  llvm::TargetMachine *machine
) {
  llvm::PassManagerBuilder builder;
  builder.OptLevel = 3;
  builder.SizeLevel = 0;
  builder.Inliner = llvm::createFunctionInliningPass(3, 0, false);
  builder.LoopVectorize = true;
  builder.SLPVectorize = true;
  machine->adjustPassManager(builder);

  builder.populateFunctionPassManager(fnPasses);
  builder.populateModulePassManager(passes);
}

void addLinkPasses(llvm::legacy::PassManagerBase &passes) {
  llvm::PassManagerBuilder builder;
  builder.VerifyInput = true;
  builder.Inliner = llvm::createFunctionInliningPass(3, 0, false);
  builder.populateLTOPassManager(passes);
}

}

void optimizeModule(llvm::TargetMachine *machine, llvm::Module *module) {
  module->setTargetTriple(machine->getTargetTriple().str());
  module->setDataLayout(machine->createDataLayout());

  llvm::legacy::PassManager passes;
  passes.add(new llvm::TargetLibraryInfoWrapperPass(machine->getTargetTriple()));
  passes.add(llvm::createTargetTransformInfoWrapperPass(machine->getTargetIRAnalysis()));

  llvm::legacy::FunctionPassManager fnPasses(module);
  fnPasses.add(llvm::createTargetTransformInfoWrapperPass(machine->getTargetIRAnalysis()));

  addOptPasses(passes, fnPasses, machine);
  addLinkPasses(passes);

  fnPasses.doInitialization();
  for (llvm::Function &func : *module) {
    fnPasses.run(func);
  }
  fnPasses.doFinalization();

  passes.add(llvm::createVerifierPass());
  passes.run(*module);
}

这大致相当于将-O3传递给opt。它使用的是一些legacy的东西,但我真的不介意。

票数 6
EN

Stack Overflow用户

发布于 2018-12-12 08:45:08

要查看LLVM的标准传递是什么,您可以尝试检查Pass接口的子类。据我所知,在LLVM本身中没有运行clang特定传递的pass。为此,你必须看看“嘎吱”声。

要准确地确定要添加哪些传递项,请查看

代码语言:javascript
运行
复制
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments  

请参阅在哪里可以找到clang -OX的优化序列?

尽管如此,仍然有一些麻烦,找到您使用的API等等。这同样适用于Clang -O3。

如果您的项目有可能,您可以做的是将LLVM IR生成到磁盘上,然后用O3标志分别编译带有clang的未优化的LLVM IR。

这就是如何使用遗留的pass管理器运行一些传递。假设您有一个LLVM上下文。

代码语言:javascript
运行
复制
 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.

这些可以通过运行

代码语言:javascript
运行
复制
functionPassMngr->run(getLLVMFunc());

如果getLLVMFunc返回当前正在生成的llvm::Function*。请注意,我在这里使用遗留的通行证管理器,原因是clang在内部使用遗留通行证管理器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53738883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档