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