Llvm 使用C++;美国石油学会

Llvm 使用C++;美国石油学会,llvm,llvm-clang,llvm-ir,llvm-c++-api,Llvm,Llvm Clang,Llvm Ir,Llvm C++ Api,我试图弄清楚如何在LLVM模块上执行所有优化(例如,all-O3优化)。我尝试了以下方法,但我不确定是否应用了所有可能的优化(例如,内联) 我还可以做些什么来提高输出LLVM IR的性能吗 编辑:我已尝试从opt.cpp中的AddOptimizationPasses()函数添加所有优化,如下所示: PassManager *pm = new PassManager(); int optLevel = 3; int sizeLevel = 0; PassManagerBuilder builder

我试图弄清楚如何在LLVM模块上执行所有优化(例如,all-O3优化)。我尝试了以下方法,但我不确定是否应用了所有可能的优化(例如,内联)

我还可以做些什么来提高输出LLVM IR的性能吗

编辑:我已尝试从
opt.cpp
中的
AddOptimizationPasses()
函数添加所有优化,如下所示:

PassManager *pm = new PassManager();
int optLevel = 3;
int sizeLevel = 0;
PassManagerBuilder builder;
builder.OptLevel = optLevel;
builder.SizeLevel = sizeLevel;
builder.Inliner = createFunctionInliningPass(optLevel, sizeLevel);
builder.DisableUnitAtATime = false;
builder.DisableUnrollLoops = false;
builder.LoopVectorize = true;
builder.SLPVectorize = true;
builder.populateModulePassManager(*pm);
pm->run(*module);
另外,在创建
PassManager
之前,我创建了一个
FunctionPassManager
,并添加了几个过程,如下所示:

FunctionPassManager *fpm = new FunctionPassManager(module);
// add several passes
fpm->doInitialization();
for (Function &f : *ir)
    fpm->run(f);
fpm->doFinalization();

但是,性能与使用-O1在命令行上运行相同,而使用-O3在命令行上可以获得更好的性能。有什么建议吗?

遵循
opt.cpp
中的函数
AddOptimizationPasses
中的逻辑。这就是真相的来源。

在研究LLVM优化时,我发现了,我认为这有可能说明为什么有人会遇到这种情况

根据您的语言和您期望的优化,您可能需要根据您的用例专门调整您的优化过程。特别是,这些过程的顺序可能很重要。例如,如果您的better-O3代码正在优化完全未优化的代码或程序已部分优化的代码,则可能只是您需要重新排序或复制一些过程,以获得预期的最终结果


鉴于此处的具体措辞以及Eli的答案被接受的事实,我不能100%确定这是否是OP所看到的,但这些知识可能会对其他类似问题的人有所帮助,他们会像我一样找到这个答案。

谢谢,我尝试了你的建议,但不幸的是我遇到了一些麻烦。我已经对问题进行了适当的编辑。您可以要求opt打印它运行的所有过程。为自定义驱动程序启用相同的设置。比较看哪些过程不在驱动程序中运行,而是使用
opt-O3
运行。要让它打印运行的过程的名称,可以将哪些选项传递给
opt
options@PaulJ.Lucas:您对(已编辑的)更改了什么问题中给出的代码最终是否能获得更好的性能?
FunctionPassManager *fpm = new FunctionPassManager(module);
// add several passes
fpm->doInitialization();
for (Function &f : *ir)
    fpm->run(f);
fpm->doFinalization();