LLVM Optimization Using C++ API -
i'm trying figure out how perform optimizations on llvm module (e.g., -o3 optimizations). i've tried following i'm not sure possible optimizations being applied (e.g., inlining).
//take string "llvm" (llvm ir) , 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; }
is there else can improve performance of output llvm ir?
edit: have tried add of optimizations addoptimizationpasses()
function in opt.cpp
, shown below:
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);
also, create functionpassmanager
before create passmanager
, add several passes so:
functionpassmanager *fpm = new functionpassmanager(module); // add several passes fpm->doinitialization(); (function &f : *ir) fpm->run(f); fpm->dofinalization();
however, performance same running on command line -o1 whereas can better performance on command line using -o3. suggestions?
follow logic in function addoptimizationpasses
in opt.cpp
. source of truth.
Comments
Post a Comment