gpt4 book ai didi

c++ - 使用现代 LLVM 运行默认优化管道

转载 作者:行者123 更新时间:2023-12-01 14:16:16 25 4
gpt4 key购买 nike

我正在使用 LLVM 7,并且我有一个 llvm::Module 我想使用标准优化管道进行优化。不幸的是,没有我可以调用的 llvm::runDefaultOptimizations 函数。似乎有无数种方法可以优化 LLVM 中的模块。我在此主题上的搜索发现了许多旧的/已弃用的 API 以及一些不适用于我的系统的示例。

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

最佳答案

我最终获取了 opt 工具 (found here) 的源代码,并删除了我不需要的所有内容。我最终得到了这个:

#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 东西,但我并不介意。

关于c++ - 使用现代 LLVM 运行默认优化管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com