【问题标题】:LLVM Optimization Using C++ API使用 C++ API 进行 LLVM 优化
【发布时间】:2015-07-07 21:29:40
【问题描述】:

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

//take string "llvm" (LLVM IR) and return "output_llvm" (optimized LLVM IR)
static string optimize(string llvm) {
    LLVMContext &ctx = getGlobalContext();
    SMDiagnostic err;
    Module *ir = ParseIR(MemoryBuffer::getMemBuffer(llvm), err, ctx);
    PassManager *pm = new PassManager();
    PassManagerBuilder builder;
    builder.OptLevel = 3;
    builder.populateModulePassManager(*pm);
    pm->run(*ir);
    delete pm;
    string output_llvm;
    raw_string_ostream buff(output_llvm);
    ir->print(buff, NULL);
    return output_llvm;
}

我还能做些什么来提高输出 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 在命令行上可以获得更好的性能。有什么建议吗?

【问题讨论】:

    标签: llvm llvm-clang llvm-ir llvm-c++-api


    【解决方案1】:

    遵循opt.cpp 中的函数AddOptimizationPasses 中的逻辑。这是真理的源泉。

    【讨论】:

    • 谢谢,我尝试了您的建议,但不幸的是我遇到了一些麻烦。我已经适当地编辑了这个问题。
    • 您可以要求选择打印它运行的所有通行证。为您的自定义驱动程序启用相同的功能。比较看看哪些通行证不在您的驱动程序中运行,但使用opt -O3 运行
    • 传递给opt 以使其打印运行的通行证名称的选项是什么?
    • @PaulJ.Lucas: -debug-pass 有多种选择
    • @PaulJ.Lucas:为了最终获得更好的性能,您对问题中提供的(已编辑的)代码做了哪些更改?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多