2

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 のパフォーマンスを向上させるために他にできることはありますか?

EDIT :以下に示すようAddOptimizationPasses()に、関数のすべての最適化を追加しようとしました:opt.cpp

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);

また、 を作成するFunctionPassManager前に を作成し、次のPassManagerようにいくつかのパスを追加します。

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

ただし、パフォーマンスは -O1 を使用してコマンド ラインで実行した場合と同じですが、-O3 を使用するとコマンド ラインではるかに優れたパフォーマンスを得ることができます。助言がありますか?

4

2 に答える 2

4

AddOptimizationPassesの関数のロジックに従いopt.cppます。これが真実の源です。

于 2015-07-07T22:26:40.980 に答える